spire_enum_macros 0.2.0

Procedural macros to facilitate enum usage, such as when delegating implementations, extracting variant types, or creating enum tables.
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<Punctuated<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,
	}
}