use syn::spanned::Spanned;
use syn::{parse_macro_input, Data, DeriveInput};
mod fields;
mod terms;
mod types;
#[proc_macro_attribute]
pub fn model(
_attr: proc_macro::TokenStream,
input: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let tokens = match input.data {
Data::Struct(data) => types::handle_struct(input.ident, input.vis, input.attrs, data),
Data::Enum(data) => types::handle_enum(input.ident, input.vis, input.attrs, data),
_ => Err(syn::Error::new(
input.span(),
"Only support struct or enum.",
)),
}
.unwrap_or_else(|err| err.to_compile_error());
proc_macro::TokenStream::from(tokens)
}