1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
pub trait HasName { fn name(&self) -> &str; fn type_name(&self) -> &str; } macro_rules! impl_has_name_for_decl { ($decl:ident, $type_name:ident) => { impl HasName for super::$decl { fn name(&self) -> &str { &self.name } fn type_name(&self) -> &str { stringify!($type_name) } } }; } impl_has_name_for_decl!(Primitive, Primitive); impl_has_name_for_decl!(Option_, Option); impl_has_name_for_decl!(Union, Union); impl_has_name_for_decl!(Array, Array); impl_has_name_for_decl!(Struct, Struct); impl_has_name_for_decl!(FixVec, FixVec); impl_has_name_for_decl!(DynVec, DynVec); impl_has_name_for_decl!(Table, Table); impl HasName for super::TopDecl { fn name(&self) -> &str { match self { super::TopDecl::Primitive(inner) => inner.name(), super::TopDecl::Option_(inner) => inner.name(), super::TopDecl::Union(inner) => inner.name(), super::TopDecl::Array(inner) => inner.name(), super::TopDecl::Struct(inner) => inner.name(), super::TopDecl::FixVec(inner) => inner.name(), super::TopDecl::DynVec(inner) => inner.name(), super::TopDecl::Table(inner) => inner.name(), } } fn type_name(&self) -> &str { match self { super::TopDecl::Primitive(inner) => inner.type_name(), super::TopDecl::Option_(inner) => inner.type_name(), super::TopDecl::Union(inner) => inner.type_name(), super::TopDecl::Array(inner) => inner.type_name(), super::TopDecl::Struct(inner) => inner.type_name(), super::TopDecl::FixVec(inner) => inner.type_name(), super::TopDecl::DynVec(inner) => inner.type_name(), super::TopDecl::Table(inner) => inner.type_name(), } } }