use proc_macro::TokenStream;
use quote::quote;
use syn::{Data, DataStruct, DeriveInput, Fields, parse_macro_input};
#[proc_macro_derive(ImplFrom)]
pub fn derive_impl_from(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let self_name = &input.ident;
let inner_ty = match &input.data {
Data::Struct(DataStruct { fields: Fields::Unnamed(u), .. }) if u.unnamed.len() == 1 => {
&u.unnamed.first().expect("one field").ty
},
_ => {
return syn::Error::new_spanned(self_name, "NewtypeDerive requires a single-tuple-field struct: `pub struct W(Inner);`").to_compile_error().into();
}
};
let expanded = quote! {
impl ::std::convert::From<#inner_ty> for #self_name { fn from(v: #inner_ty) -> Self { Self(v) } } impl ::std::convert::From<#self_name> for #inner_ty { fn from(w: #self_name) -> Self { w.0 } }
};
TokenStream::from(expanded)
}