#![forbid(unsafe_code)]
mod attribute_parsing;
mod case_conversion;
mod enum_derive;
mod struct_derive;
use proc_macro::TokenStream;
use syn::{Data, DeriveInput, parse_macro_input};
use crate::attribute_parsing::parse_container_attrs;
#[proc_macro_derive(Automorph, attributes(automorph))]
pub fn derive_automorph(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let container_attrs = parse_container_attrs(&input.attrs);
match &input.data {
Data::Struct(data) => {
if container_attrs.transparent {
struct_derive::derive_transparent_struct(&input, data)
} else {
struct_derive::derive_struct(&input, data)
}
}
Data::Enum(data) => enum_derive::derive_enum(&input, data),
Data::Union(_) => {
syn::Error::new(input.ident.span(), "Automorph cannot be derived for unions")
.to_compile_error()
.into()
}
}
}