UseField

Struct UseField 

Source
pub struct UseField<Tag>(pub PhantomData<Tag>);
Expand description

The UseField pattern is used to implement a CGP getter trait by reading the Tag field from Context via the HasField trait.

When a CGP getter component contains only one getter method and is defined using the #[cgp_getter] macro, a UseField implementation is automatically generated.

Typically, the Tag type would be a type-level string defined through the Symbol! macro, such as Symbol!("name"). It may also be a type-level integer that is wrapped in the Index type, such as Index<0>. The HasField implementation for these tag types would be automatically implemented following the field names in the struct when #[derive(HasField)] is used.

However, users are free to use any type as the Tag type, as there is no additional constraints on what the type should be. The only consequence is that such manual tags would not be automatically implemented by #[derive(HasField)], and so users would have to manually implement the HasField instances, or generate them from a different macro.

UseField allows users to easily implement a getter trait for a context by only having to derive the HasField trait, and specifying the field name through UseField. This reduces the amount of boilerplate code required to manually implement the getter trait for each concrete context.

§Example

Given the following getter component definition:

#[cgp_getter(NameGetter)]
pub trait HasName {
    fn name(&self) -> &str;
}

The following UseField implementation would be generated:

impl<Context, Tag> NameGetter<Context> for UseField<Tag>
where
    Context: HasField<Tag, Value = String>,
{
    fn name(context: &Context) -> &str {
        &context.get_field(PhantomData).as_str()
    }
}

Tuple Fields§

§0: PhantomData<Tag>

Trait Implementations§

Source§

impl<Context, OutTag, Tag, Value> FieldGetter<Context, OutTag> for UseField<Tag>
where Context: HasField<Tag, Value = Value>,

Source§

type Value = Value

Source§

fn get_field(context: &Context, _tag: PhantomData<OutTag>) -> &Value

Source§

impl<Context, OutTag, Tag, Value> MutFieldGetter<Context, OutTag> for UseField<Tag>
where Context: HasFieldMut<Tag, Value = Value>,

Source§

impl<Context, TypeTag, FieldTag, Field> ProvideType<Context, TypeTag> for UseField<FieldTag>
where Context: HasField<FieldTag, Value = Field>,

Source§

type Type = Field

Source§

impl<Context, TypeTag, FieldTag, Field> IsProviderFor<TypeComponent, Context, TypeTag> for UseField<FieldTag>
where Context: HasField<FieldTag, Value = Field>,

Auto Trait Implementations§

§

impl<Tag> Freeze for UseField<Tag>

§

impl<Tag> RefUnwindSafe for UseField<Tag>
where Tag: RefUnwindSafe,

§

impl<Tag> Send for UseField<Tag>
where Tag: Send,

§

impl<Tag> Sync for UseField<Tag>
where Tag: Sync,

§

impl<Tag> Unpin for UseField<Tag>
where Tag: Unpin,

§

impl<Tag> UnwindSafe for UseField<Tag>
where Tag: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<Builder, Source, Output> CanBuildFrom<Source> for Builder
where Source: HasFields + IntoBuilder, <Source as HasFields>::Fields: FieldsBuilder<<Source as IntoBuilder>::Builder, Builder, Output = Output>,

Source§

type Output = Output

Source§

fn build_from(self, source: Source) -> Output

Source§

impl<Source, Target, Remainder> CanDowncastFields<Target> for Source
where Target: HasFields, <Target as HasFields>::Fields: FieldsExtractor<Source, Target, Remainder = Remainder>,

Source§

type Remainder = Remainder

Source§

fn downcast_fields( self, _tag: PhantomData<Target>, ) -> Result<Target, <Source as CanDowncastFields<Target>>::Remainder>

Source§

impl<Getter, Context, Tag> FieldMapper<Context, Tag> for Getter
where Getter: FieldGetter<Context, Tag> + 'static, Tag: 'static,

Source§

fn map_field<T>( context: &Context, tag: PhantomData<Tag>, mapper: impl for<'a> FnOnce(&'a <Getter as FieldGetter<Context, Tag>>::Value) -> &'a T, ) -> &T

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.