use proc_macro::TokenStream;
mod expand;
mod parse;
#[derive(Debug)]
struct ParseResult {
pub ident: syn::Ident,
pub from: Vec<(syn::Type, syn::Expr)>,
pub into: Vec<(syn::Type, syn::Expr)>,
pub partial_eq: Vec<(syn::Type, syn::Expr)>,
pub iter: Option<syn::Type>,
}
impl ParseResult {
fn new(ident: syn::Ident) -> Self {
Self {
ident,
from: Vec::default(),
into: Vec::default(),
partial_eq: Vec::default(),
iter: None,
}
}
}
#[proc_macro_derive(Newtype, attributes(newtype))]
pub fn derive(input: TokenStream) -> TokenStream {
let input = syn::parse_macro_input!(input as syn::DeriveInput);
parse_input_and_expand_derive(input).unwrap_or_else(|err| err.to_compile_error().into())
}
fn parse_input_and_expand_derive(input: syn::DeriveInput) -> syn::Result<TokenStream> {
let derive = parse::parse_input(input)?;
expand::expand_derive(&derive)
}