pleme_implfrom_derive/
lib.rs1use 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}