#![deny(missing_docs)]
use {
proc_macro::TokenStream,
quote::quote,
syn::{parse_macro_input, DeriveInput, GenericParam},
};
#[proc_macro_derive(IntoTrieIter)]
pub fn derive_into_trie_iter(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let ident = &input.ident;
let params: Vec<_> = input.generics.params.iter().collect();
let valid =
matches!(params.as_slice(), [GenericParam::Lifetime(lt)] if lt.lifetime.ident == "a");
if !valid {
let msg = format!(
"#[derive(IntoTrieIter)] requires exactly one generic parameter, a lifetime named \
`'a`; found {} parameter(s) on `{}`",
params.len(),
ident
);
return quote! { compile_error!(#msg); }.into();
}
let output = quote! {
impl<'a> IntoIterator for #ident<'a> {
type Item = Vec<usize>;
type IntoIter = TrieIteratorWrapper<Self>;
fn into_iter(self) -> Self::IntoIter {
TrieIteratorWrapper::new(self)
}
}
};
output.into()
}