Visit

Derive Macro Visit 

Source
#[derive(Visit)]
{
    // Attributes available to this derive:
    #[visit]
}
Expand description

Implements Visit trait

User has to import Visit, Visitor and VisitResult to use this macro.

ยงExpansion

For example,

use fyrox_core::visitor::{Visit, VisitResult, Visitor};
#[derive(Visit)]
struct Foo<T> {
    example_one: String,
    example_two: T,
}

would expand to something like:

impl<T> Visit for Foo<T> where T: Visit {
    fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult {
        let mut region = visitor.enter_region(name)?;
        self.example_one.visit("ExampleOne", &mut region)?;
        self.example_two.visit("ExampleTwo", &mut region)?;
        Ok(())
    }
}

Field names are converted to strings using to_case(Case::UpperCamel).

#[derive(Visit)]
struct Pair (usize, usize);

would expand to something like:

impl Visit for Pair {
    fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult {
        let mut region = visitor.enter_region(name)?;
        self.0.visit("0", &mut region)?;
        self.1.visit("1", &mut region)?;
        Ok(())
    }
}
#[derive(Visit)]
enum EnumExample { A, B(usize) }

would expand to something like:

impl Visit for EnumExample {
    fn visit(&mut self, name: &str, visitor: &mut Visitor) -> VisitResult {
        let mut region = visitor.enter_region(name)?;
        let mut id = id(self);
        id.visit("Id", &mut region)?;
        if region.is_reading() {
            *self = from_id(id)?;
        }
        match self {
            EnumExample::A => (),
            EnumExample::B(x) => { x.visit("0", &mut region)?; }
        }
        return Ok(());
        fn id(me: &EnumExample) -> u32 {
            match me {
                EnumExample::A => 0,
                EnumExample::B(_) => 1,
            }
        }
        fn from_id(id: u32) -> std::result::Result<EnumExample,String> {
            match id {
                0 => Ok(EnumExample::A),
                1 => Ok(EnumExample::B(Default::default())),
                _ => Err(format!("Unknown ID for type `EnumExample`: `{}`", id)),
            }
        }
    }
}