use once_cell::sync::Lazy;
use proc_macro::TokenStream;
use proc_macro_crate::FoundCrate;
use syn::{DataEnum, DataStruct, DataUnion, DeriveInput, parse_macro_input};
mod r#enum;
mod r#struct;
mod union;
mod util;
const CRATE: &str = "narrow";
static NARROW: Lazy<String> = Lazy::new(|| match proc_macro_crate::crate_name(CRATE) {
Ok(found) => match found {
FoundCrate::Itself => CRATE.to_string(),
FoundCrate::Name(name) => name,
},
_ => CRATE.to_string(),
});
#[proc_macro_derive(ArrayType, attributes(narrow))]
pub fn derive_array_type(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
match input.data {
syn::Data::Struct(DataStruct { ref fields, .. }) => r#struct::derive(&input, fields),
syn::Data::Enum(DataEnum { ref variants, .. }) => r#enum::derive(&input, variants),
syn::Data::Union(DataUnion { ref fields, .. }) => union::derive(&input, fields),
}
.into()
}