pleme-implfrom-derive 0.1.0

Newtype derive proc-macro emitted from a tatara-rust-derive NewtypeDeriveSpec.
Documentation
// GENERATED by tatara-rust-derive::NewtypeDeriveSpec.
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)
}