1use once_cell::sync::Lazy;
2use proc_macro::TokenStream;
3use proc_macro_crate::FoundCrate;
4use syn::{DataEnum, DataStruct, DataUnion, DeriveInput, parse_macro_input};
5
6mod r#enum;
7mod r#struct;
8mod union;
9mod util;
10
11const CRATE: &str = "narrow";
12
13static NARROW: Lazy<String> = Lazy::new(|| match proc_macro_crate::crate_name(CRATE) {
14 Ok(found) => match found {
15 FoundCrate::Itself => CRATE.to_string(),
17 FoundCrate::Name(name) => name,
18 },
19 _ => CRATE.to_string(),
20});
21
22#[proc_macro_derive(ArrayType, attributes(narrow))]
25pub fn derive_array_type(input: TokenStream) -> TokenStream {
26 let input = parse_macro_input!(input as DeriveInput);
27
28 match input.data {
29 syn::Data::Struct(DataStruct { ref fields, .. }) => r#struct::derive(&input, fields),
30 syn::Data::Enum(DataEnum { ref variants, .. }) => r#enum::derive(&input, variants),
31 syn::Data::Union(DataUnion { ref fields, .. }) => union::derive(&input, fields),
32 }
33 .into()
34}