Skip to main content

pleme_implfrom_derive/
lib.rs

1// GENERATED by tatara-rust-derive::NewtypeDeriveSpec.
2use proc_macro::TokenStream;
3use quote::quote;
4use syn::{Data, DataStruct, DeriveInput, Fields, parse_macro_input};
5
6#[proc_macro_derive(ImplFrom)]
7pub fn derive_impl_from(input: TokenStream) -> TokenStream {
8    let input = parse_macro_input!(input as DeriveInput);
9    let self_name = &input.ident;
10
11    let inner_ty = match &input.data {
12        Data::Struct(DataStruct { fields: Fields::Unnamed(u), .. }) if u.unnamed.len() == 1 => {
13            &u.unnamed.first().expect("one field").ty
14        },
15        _ => {
16            return syn::Error::new_spanned(self_name, "NewtypeDerive requires a single-tuple-field struct: `pub struct W(Inner);`").to_compile_error().into();
17        }
18    };
19
20    let expanded = quote! {
21        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 } }
22    };
23    TokenStream::from(expanded)
24}