spire_enum_macros 0.7.2

Procedural macros distributed by the crate `spire_enum`.
Documentation
use super::*;

#[derive(Parse, ToTokens)]
pub enum InputImplItem {
    Const(Box<InputImplItemConst>),
    Fn(Box<InputImplItemFn>),
    Type(Box<InputImplItemAssocType>),
    Macro(Box<syn::ImplItemMacro>),
}

#[derive(Parse, ToTokens)]
pub struct InputImplItemFn {
    pub attrs: Any<Attribute<SynMeta>>,
    pub vis:   Visibility,
    pub sig:   InputFnSignature,
    pub body:  InputImplItemFnBody,
}

#[derive(Parse, ToTokens)]
pub enum InputImplItemFnBody {
    Block(Block),
    SemiColon(Token![;]),
}

#[derive(Parse, ToTokens)]
pub struct InputImplItemConst {
    pub attrs: Any<Attribute<SynMeta>>,
    pub vis: Visibility,
    pub const_token: Token![const],
    pub ident: Ident,
    pub generics: Optional<InputGenerics>,
    pub colon_token: Token![:],
    pub ty: Type,
    pub body: InputImplItemConstBody,
    pub semi_token: Token![;],
}

#[derive(Parse, ToTokens)]
pub enum InputImplItemConstBody {
    Some(Token![=], Box<Expr>),
    None,
}

#[derive(Parse, ToTokens)]
pub struct InputImplItemAssocType {
    pub attrs: Any<Attribute<SynMeta>>,
    pub type_token: Token![type],
    pub ident: Ident,
    pub generics: Optional<InputGenerics>,
    pub body: InputImplItemAssocTypeBody,
    pub semi_token: Token![;],
}

#[derive(Parse, ToTokens)]
pub enum InputImplItemAssocTypeBody {
    Some(Token![=], Box<Type>),
    None,
}

#[derive(Parse, ToTokens)]
pub struct InputFnSignature {
    pub constness: Optional<Token![const]>,
    pub asyncness: Optional<Token![async]>,
    pub unsafety: Optional<Token![unsafe]>,
    pub abi: Optional<syn::Abi>,
    pub fn_token: Token![fn],
    pub ident: Ident,
    pub generics: Optional<InputGenerics>,
    pub inputs: Paren<InputPunctuated<FnArg, Token![,]>>,
    pub output: syn::ReturnType,
    pub where_clause: Optional<WhereClause>,
}

pub fn find_enum_ident(ty: &Type) -> Option<&Ident> {
    match ty {
        | Type::Group(TypeGroup { elem, .. })
        | Type::Paren(TypeParen { elem, .. })
        | Type::Reference(TypeReference { elem, .. })
        | Type::Ptr(TypePtr { elem, .. }) => find_enum_ident(elem),

        Type::Tuple(TypeTuple { elems, .. }) => elems.first().and_then(find_enum_ident),
        Type::Path(TypePath { path, .. }) => path.segments.last().map(|seg| &seg.ident),
        _ => None,
    }
}