#[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)),
}
}
}
}