#![doc = include_str!("../README.md")]
use proc_macro::TokenStream;
mod expand;
mod parse;
#[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)
}
#[derive(Debug)]
struct ParseResult {
newtype: syn::Ident,
inner_ty: syn::Type,
generics: syn::Generics,
from: Vec<(syn::Type, syn::Expr)>,
try_from: Vec<(syn::Type, syn::Type, syn::Expr)>,
into: Vec<(syn::Type, syn::Expr)>,
try_into: Vec<(syn::Type, syn::Type, syn::Expr)>,
add: Vec<(syn::Type, syn::Type, syn::Expr)>,
add_assign: Vec<(syn::Type, syn::Expr)>,
partial_eq: Vec<(syn::Type, syn::Expr)>,
sub: Vec<(syn::Type, syn::Type, syn::Expr)>,
sub_assign: Vec<(syn::Type, syn::Expr)>,
}
impl ParseResult {
fn new(newtype: syn::Ident, inner_ty: syn::Type, generics: syn::Generics) -> Self {
Self {
newtype,
inner_ty,
generics,
from: Vec::default(),
try_from: Vec::default(),
into: Vec::default(),
try_into: Vec::default(),
add: Vec::default(),
add_assign: Vec::default(),
partial_eq: Vec::default(),
sub: Vec::default(),
sub_assign: Vec::default(),
}
}
}