pub type GetFieldType<This, FieldPath> = <This as FieldType<FieldPath>>::Ty;
Expand description
Queries the type of a field.
§Example
Here is one way you can get the type of a struct
field.
use structural::{GetField,StructuralExt,GetFieldType,FP,fp};
fn get_name<'a,T>(this:&'a T)->&'a GetFieldType<T,FP!(name)>
where
T:GetField<FP!(name)>,
{
this.field_(fp!(name))
}
#[derive(structural::Structural)]
struct Huh<T>{
#[struc(public)]
#[struc(rename="name")]
value:T,
}
fn main(){
let this=Huh{ value:"ooh".to_string() };
assert_eq!( get_name(&this), "ooh" );
}
Another way get_name
could have been written is like this:
use structural::{GetField,StructuralExt,GetFieldType,FP,fp};
fn get_name<T,O>(this:&T)->&O
where
T:GetField<FP!(name), Ty=O>
{
this.field_(fp!(name))
}
A potential downside of adding another type parameter is that it
makes it less ergonomic to specify the type of T
while ignoring the field type,
since one has to write it as get_name::<Foo,_>(&foo)
.
§Example
Here’s an example of accessing an enum
field,using GetFieldType
to get the field type.
This also demonstrates a way to write extension traits.
use structural::{FP, StructuralExt, GetFieldType, GetVariantField, Structural, TS, fp};
use structural::for_examples::EnumOptA;
let foo= EnumOptA::Limbs{legs:Some(9), hands:None};
assert_eq!( foo.get_limbs(), Some((&Some(9), &None)) );
let array=[0,1,2,3];
let baz=EnumGround::Limbs{legs:"many", hands:&array};
assert_eq!( baz.get_limbs(), Some((&"many", &&array[..])) );
trait GetLimbs:
GetVariantField<TS!(Limbs),TS!(legs)> +
GetVariantField<TS!(Limbs),TS!(hands)>
{
fn get_limbs(&self)-> Option<(
&GetFieldType<Self, FP!(::Limbs.legs)>,
&GetFieldType<Self, FP!(::Limbs.hands)>,
)> {
self.fields(fp!(::Limbs=>legs,hands))
}
}
impl<T> GetLimbs for T
where
T: ?Sized +
GetVariantField<TS!(Limbs),TS!(legs)> +
GetVariantField<TS!(Limbs),TS!(hands)>
{}
#[derive(Structural, Copy, Clone, Debug, PartialEq)]
#[struc(no_trait)]
pub enum EnumGround<'a> {
Limbs {
legs: &'static str,
hands: &'a [u8],
},
}