mod from_error;
mod state;
use proc_macro::TokenStream;
use syn::{DataEnum, DeriveInput, FieldsNamed, FieldsUnnamed};
#[proc_macro_derive(AppState)]
pub fn derive_state_from(tokens: TokenStream) -> TokenStream {
let abstract_syntax_tree: DeriveInput =
syn::parse(tokens).expect("could not parse derive macro input");
let name = abstract_syntax_tree.ident;
match abstract_syntax_tree.data {
syn::Data::Struct(s) => match s.fields {
syn::Fields::Unit => panic!("unit structs are not supported"),
syn::Fields::Unnamed(FieldsUnnamed { unnamed, .. }) => {
state::derive_unnamed(name, unnamed)
}
syn::Fields::Named(FieldsNamed { named, .. }) => state::derive_named(name, named),
},
syn::Data::Enum(DataEnum { .. }) => panic!(
"enums are currently not supported (but could be, please shout if you need this)"
),
_ => panic!("only structs supported"),
}
}
#[proc_macro_derive(FromError)]
pub fn from_error_derive(tokens: TokenStream) -> TokenStream {
let abstract_syntax_tree: DeriveInput =
syn::parse(tokens).expect("could not parse derive macro input");
let name = abstract_syntax_tree.ident;
match abstract_syntax_tree.data {
syn::Data::Struct(s) => match s.fields {
syn::Fields::Unit => panic!("unit structs are not supported"),
syn::Fields::Unnamed(FieldsUnnamed { unnamed, .. }) => {
from_error::derive_unnamed(name, unnamed)
}
syn::Fields::Named(FieldsNamed { named, .. }) => from_error::derive_named(name, named),
},
syn::Data::Enum(DataEnum { variants, .. }) => from_error::derive_enum(name, variants),
_ => panic!("only structs and enums are supported"),
}
}