mod private
{
use crate :: *;
#[ derive( Debug, PartialEq, Clone ) ]
pub enum FieldOrVariant< 'a >
{
Field(&'a syn ::Field),
Variant(&'a syn ::Variant),
}
impl Copy for FieldOrVariant< '_ > {}
impl< 'a > From< &'a syn ::Field > for FieldOrVariant< 'a >
{
fn from(field: &'a syn ::Field) -> Self
{
FieldOrVariant ::Field(field)
}
}
impl< 'a > From< &'a syn ::Variant > for FieldOrVariant< 'a >
{
fn from(variant: &'a syn ::Variant) -> Self
{
FieldOrVariant ::Variant(variant)
}
}
impl quote ::ToTokens for FieldOrVariant< '_ >
{
fn to_tokens(&self, tokens: &mut proc_macro2 ::TokenStream)
{
match self
{
FieldOrVariant ::Field(item) =>
{
item.to_tokens(tokens);
}
FieldOrVariant ::Variant(item) =>
{
item.to_tokens(tokens);
}
}
}
}
impl FieldOrVariant< '_ >
{
#[ must_use ]
pub fn attrs( &self ) -> &Vec< syn ::Attribute >
{
match self
{
FieldOrVariant ::Field(e) => &e.attrs,
FieldOrVariant ::Variant(e) => &e.attrs,
}
}
#[ must_use ]
pub fn vis( &self ) -> Option< &syn ::Visibility >
{
match self
{
FieldOrVariant ::Field(e) => Some(&e.vis),
FieldOrVariant ::Variant(_) => None,
}
}
#[ must_use ]
pub fn mutability( &self ) -> Option< &syn ::FieldMutability >
{
match self
{
FieldOrVariant ::Field(e) => Some(&e.mutability),
FieldOrVariant ::Variant(_) => None,
}
}
#[ must_use ]
pub fn ident( &self ) -> Option< &syn ::Ident >
{
match self
{
FieldOrVariant ::Field(e) => e.ident.as_ref(),
FieldOrVariant ::Variant(e) => Some(&e.ident),
}
}
#[ must_use ]
pub fn typ( &self ) -> Option< &syn ::Type >
{
match self
{
FieldOrVariant ::Field(e) => Some(&e.ty),
FieldOrVariant ::Variant(_e) => None,
}
}
#[ must_use ]
pub fn fields( &self ) -> Option< &syn ::Fields >
{
match self
{
FieldOrVariant ::Field(_) => None,
FieldOrVariant ::Variant(e) => Some(&e.fields),
}
}
#[ must_use ]
pub fn discriminant( &self ) -> Option< &(syn ::token ::Eq, syn ::Expr) >
{
match self
{
FieldOrVariant ::Field(_) => None,
FieldOrVariant ::Variant(e) => e.discriminant.as_ref(),
}
}
}
#[ derive( Debug, PartialEq ) ]
pub enum StructLike
{
Unit(syn ::ItemStruct),
Struct(syn ::ItemStruct),
Enum(syn ::ItemEnum),
}
impl From< syn ::ItemStruct > for StructLike
{
fn from(item_struct: syn ::ItemStruct) -> Self
{
if item_struct.fields.is_empty()
{
StructLike ::Unit(item_struct)
} else {
StructLike ::Struct(item_struct)
}
}
}
impl From< syn ::ItemEnum > for StructLike
{
fn from(item_enum: syn ::ItemEnum) -> Self
{
StructLike ::Enum(item_enum)
}
}
impl syn ::parse ::Parse for StructLike
{
fn parse(input: syn ::parse ::ParseStream< '_ >) -> syn ::Result< Self >
{
use syn :: { ItemStruct, ItemEnum, Visibility, Attribute };
let attributes: Vec< Attribute > = input.call(Attribute ::parse_outer)?;
let visibility: Visibility = input.parse().unwrap_or(syn ::Visibility ::Inherited);
let lookahead = input.lookahead1();
if lookahead.peek(syn ::Token![struct])
{
let mut item_struct: ItemStruct = input.parse()?;
item_struct.vis = visibility;
item_struct.attrs = attributes;
if item_struct.fields.is_empty()
{
Ok(StructLike ::Unit(item_struct))
} else {
Ok(StructLike ::Struct(item_struct))
}
} else if lookahead.peek(syn ::Token![enum])
{
let mut item_enum: ItemEnum = input.parse()?;
item_enum.vis = visibility;
item_enum.attrs = attributes;
Ok(StructLike ::Enum(item_enum))
} else {
Err(lookahead.error())
}
}
}
impl quote ::ToTokens for StructLike
{
fn to_tokens(&self, tokens: &mut proc_macro2 ::TokenStream)
{
match self
{
StructLike ::Unit(item) | StructLike ::Struct(item) =>
{
item.to_tokens(tokens);
}
StructLike ::Enum(item) =>
{
item.to_tokens(tokens);
}
}
}
}
impl StructLike
{
pub fn elements< 'a >(&'a self) -> BoxedIter< 'a, FieldOrVariant<'a >>
{
match self
{
StructLike ::Unit(_) =>
{
let empty: Vec< FieldOrVariant<'a >> = vec![];
Box ::new(empty.into_iter())
}
StructLike ::Struct(item) =>
{
let fields = item.fields.iter().map(FieldOrVariant ::from);
Box ::new(fields)
}
StructLike ::Enum(item) =>
{
let variants = item.variants.iter().map(FieldOrVariant ::from);
Box ::new(variants)
}
}
}
#[ must_use ]
pub fn attrs( &self ) -> &Vec< syn ::Attribute >
{
match self
{
StructLike ::Unit(item) | StructLike ::Struct(item) => &item.attrs,
StructLike ::Enum(item) => &item.attrs,
}
}
#[ must_use ]
pub fn vis( &self ) -> &syn ::Visibility
{
match self
{
StructLike ::Unit(item) | StructLike ::Struct(item) => &item.vis,
StructLike ::Enum(item) => &item.vis,
}
}
#[ must_use ]
pub fn ident( &self ) -> &syn ::Ident
{
match self
{
StructLike ::Unit(item) | StructLike ::Struct(item) => &item.ident,
StructLike ::Enum(item) => &item.ident,
}
}
#[ must_use ]
pub fn generics( &self ) -> &syn ::Generics
{
match self
{
StructLike ::Unit(item) | StructLike ::Struct(item) => &item.generics,
StructLike ::Enum(item) => &item.generics,
}
}
#[ must_use ]
pub fn fields< 'a >(&'a self) -> BoxedIter< 'a, &'a syn ::Field >
{
let result: BoxedIter< 'a, &'a syn ::Field > = match self
{
StructLike ::Unit(_item) => Box ::new(core ::iter ::empty()),
StructLike ::Struct(item) => Box ::new(item.fields.iter()),
StructLike ::Enum(_item) => Box ::new(core ::iter ::empty()),
};
result
}
#[ must_use ]
pub fn field_names( &self ) -> Option< BoxedIter<'_, &syn ::Ident >>
{
match self
{
StructLike ::Unit(item) | StructLike ::Struct(item) => item_struct ::field_names(item),
StructLike ::Enum(_item) =>
{
let iter = Box ::new(self.fields().map(|field| field.ident.as_ref().unwrap()));
Some(iter)
}
}
}
#[ must_use ]
pub fn field_types( &self ) -> BoxedIter< '_, &syn ::Type >
{
Box ::new(self.fields().map(move |field| &field.ty))
}
#[ must_use ]
pub fn field_attrs( &self ) -> BoxedIter< '_, &Vec< syn ::Attribute >>
{
Box ::new(self.fields().map(|field| &field.attrs))
}
#[ must_use ]
pub fn first_field( &self ) -> Option< &syn ::Field >
{
self.fields().next()
}
}
}
#[ doc( inline ) ]
#[ allow( unused_imports ) ]
pub use own :: *;
#[ allow( unused_imports ) ]
pub mod own
{
use super :: *;
#[ doc( inline ) ]
pub use orphan :: *;
#[ doc( inline ) ]
pub use private :: { StructLike, FieldOrVariant };
}
#[ allow( unused_imports ) ]
pub mod orphan
{
use super :: *;
#[ doc( inline ) ]
pub use exposed :: *;
}
#[ allow( unused_imports ) ]
pub mod exposed
{
use super :: *;
pub use super ::super ::struct_like;
#[ doc( inline ) ]
pub use prelude :: *;
}
#[ allow( unused_imports ) ]
pub mod prelude
{
use super :: *;
}