narrow_derive/
lib.rs

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        // Requires `extern crate self as narrow`
16        FoundCrate::Itself => CRATE.to_string(),
17        FoundCrate::Name(name) => name,
18    },
19    _ => CRATE.to_string(),
20});
21
22/// Derive macro for the ArrayType trait.
23///
24#[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}