strand_derive/
lib.rs

1mod build_error;
2mod meta_map;
3mod search_meta;
4mod strand_enum;
5mod strand_struct;
6
7use strand_enum::strand_derive_enum;
8use strand_struct::strand_derive_struct;
9
10use proc_macro::TokenStream;
11
12#[proc_macro_derive(Strand, attributes(strand))]
13pub fn strand_derive(input: TokenStream) -> TokenStream {
14    let input = syn::parse_macro_input!(input as syn::DeriveInput);
15
16    match &input.data {
17        syn::Data::Struct(_) => strand_derive_struct(input)
18            .unwrap_or_else(syn::Error::into_compile_error)
19            .into(),
20        syn::Data::Enum(_) => strand_derive_enum(input)
21            .unwrap_or_else(syn::Error::into_compile_error)
22            .into(),
23        syn::Data::Union(_) => syn::Error::new_spanned(input, "expected list, \"#[strand(..)]\"")
24            .to_compile_error()
25            .into(),
26    }
27}