spire_enum_macros 0.2.1

Procedural macros to facilitate enum usage, such as when delegating implementations, extracting variant types, or creating enum tables.
Documentation
use super::*;

#[derive(Clone, Parse, ToTokens)]
pub struct Attribute<Meta> {
	pub pound_token: token::Pound,
	pub inner: Bracket<Meta>,
}

impl<Meta> Attribute<Meta> {
	#[allow(unused)]
	pub fn map<M>(self, f: impl FnOnce(Meta) -> M) -> Attribute<M> {
		let Self { pound_token, inner } = self;
		let (bracket_token, meta) = inner.into_parts();
		Attribute {
			pound_token,
			inner: Bracket::from((bracket_token, f(meta))),
		}
	}
}

#[allow(clippy::large_enum_variant)]
#[derive(Clone, Parse, ToTokens)]
pub enum Meta<T> {
	Custom(T),
	Syn(SynMeta),
}

pub fn split_input_attrs<T>(
	metas: impl IntoIterator<Item = Attribute<Meta<T>>>,
) -> (Any<Attribute<SynMeta>>, Any<Attribute<T>>) {
	let mut syn_metas = Vec::new();
	let mut custom_metas = Vec::new();

	for Attribute { pound_token, inner } in metas {
		let (bracket_token, meta) = inner.into_parts();

		match meta {
			Meta::Custom(c) => {
				custom_metas.push(Attribute {
					pound_token,
					inner: Bracket::from((bracket_token, c)),
				})
			}
			Meta::Syn(s) => {
				syn_metas.push(Attribute {
					pound_token,
					inner: Bracket::from((bracket_token, s)),
				})
			}
		}
	}

	(Any::from(syn_metas), Any::from(custom_metas))
}

pub fn split_input_metas<T>(metas: impl IntoIterator<Item = Meta<T>>) -> (Vec<SynMeta>, Vec<T>) {
	let mut syn_metas = Vec::new();
	let mut custom_metas = Vec::new();

	for meta in metas {
		match meta {
			Meta::Custom(c) => custom_metas.push(c),
			Meta::Syn(s) => syn_metas.push(s),
		}
	}

	(syn_metas, custom_metas)
}