use crate::{Reflect, TypePath, TypePathTable}; use std::any::{Any, TypeId}; /// The named field of a reflected struct. #[derive(Clone, Debug)] pub struct NamedField { name: &'static str, type_path: TypePathTable, type_id: TypeId, #[cfg(feature = "documentation")] docs: Option<&'static str>, } impl NamedField { /// Create a new [`NamedField`]. pub fn new(name: &'static str) -> Self { Self { name, type_path: TypePathTable::of::(), type_id: TypeId::of::(), #[cfg(feature = "documentation")] docs: None, } } /// Sets the docstring for this field. #[cfg(feature = "documentation")] pub fn with_docs(self, docs: Option<&'static str>) -> Self { Self { docs, ..self } } /// The name of the field. pub fn name(&self) -> &'static str { self.name } /// A representation of the type path of the field. /// /// Provides dynamic access to all methods on [`TypePath`]. pub fn type_path_table(&self) -> &TypePathTable { &self.type_path } /// The [stable, full type path] of the field. /// /// Use [`type_path_table`] if you need access to the other methods on [`TypePath`]. /// /// [stable, full type path]: TypePath /// [`type_path_table`]: Self::type_path_table pub fn type_path(&self) -> &'static str { self.type_path_table().path() } /// The [`TypeId`] of the field. pub fn type_id(&self) -> TypeId { self.type_id } /// Check if the given type matches the field type. pub fn is(&self) -> bool { TypeId::of::() == self.type_id } /// The docstring of this field, if any. #[cfg(feature = "documentation")] pub fn docs(&self) -> Option<&'static str> { self.docs } } /// The unnamed field of a reflected tuple or tuple struct. #[derive(Clone, Debug)] pub struct UnnamedField { index: usize, type_path: TypePathTable, type_id: TypeId, #[cfg(feature = "documentation")] docs: Option<&'static str>, } impl UnnamedField { pub fn new(index: usize) -> Self { Self { index, type_path: TypePathTable::of::(), type_id: TypeId::of::(), #[cfg(feature = "documentation")] docs: None, } } /// Sets the docstring for this field. #[cfg(feature = "documentation")] pub fn with_docs(self, docs: Option<&'static str>) -> Self { Self { docs, ..self } } /// Returns the index of the field. pub fn index(&self) -> usize { self.index } /// A representation of the type path of the field. /// /// Provides dynamic access to all methods on [`TypePath`]. pub fn type_path_table(&self) -> &TypePathTable { &self.type_path } /// The [stable, full type path] of the field. /// /// Use [`type_path_table`] if you need access to the other methods on [`TypePath`]. /// /// [stable, full type path]: TypePath /// [`type_path_table`]: Self::type_path_table pub fn type_path(&self) -> &'static str { self.type_path_table().path() } /// The [`TypeId`] of the field. pub fn type_id(&self) -> TypeId { self.type_id } /// Check if the given type matches the field type. pub fn is(&self) -> bool { TypeId::of::() == self.type_id } /// The docstring of this field, if any. #[cfg(feature = "documentation")] pub fn docs(&self) -> Option<&'static str> { self.docs } }