@@ -27,6 +27,8 @@ const EXAMPLE: &str = r#"#[wrapper(LowerHex, Add)]"#;
2727#[ derive( Copy , Clone , PartialEq , Eq , Ord , PartialOrd , Debug ) ]
2828enum Wrapper {
2929 NoRefs ,
30+ NoFrom ,
31+ From ,
3032 // Formatting
3133 FromStr ,
3234 Display ,
@@ -127,7 +129,7 @@ impl FromPath for Wrapper {
127129 const NO_REFS : Self = Self :: NoRefs ;
128130
129131 fn default_set ( ) -> Vec < Self > {
130- vec ! [ Wrapper :: AsRef , Wrapper :: Borrow ]
132+ vec ! [ Wrapper :: From , Wrapper :: AsRef , Wrapper :: Borrow ]
131133 }
132134
133135 fn is_not_ref ( & self ) -> bool {
@@ -139,6 +141,8 @@ impl FromPath for Wrapper {
139141 Err ( attr_err ! ( path. span( ) , NAME , "must contain at least one identifier" , EXAMPLE ) ) ,
140142 |segment| {
141143 Ok ( match segment. ident . to_string ( ) . as_str ( ) {
144+ "From" => Some ( Wrapper :: From ) ,
145+ "NoFrom" => Some ( Wrapper :: NoFrom ) ,
142146 "FromStr" => Some ( Wrapper :: FromStr ) ,
143147 "Display" => Some ( Wrapper :: Display ) ,
144148 "Debug" => Some ( Wrapper :: Debug ) ,
@@ -247,6 +251,15 @@ impl Wrapper {
247251 let amplify_crate = get_amplify_crate ( input) ;
248252
249253 match self {
254+ Wrapper :: From => quote ! {
255+ #[ automatically_derived]
256+ impl #impl_generics #amplify_crate:: FromInner for #ident_name #ty_generics #where_clause {
257+ #[ inline]
258+ fn from_inner( inner: Self :: Inner ) -> Self {
259+ Self :: from( inner)
260+ }
261+ }
262+ } ,
250263 Wrapper :: FromStr => quote ! {
251264 #[ automatically_derived]
252265 impl #impl_generics :: core:: str :: FromStr for #ident_name #ty_generics #where_clause
@@ -641,6 +654,7 @@ impl Wrapper {
641654 }
642655 } ,
643656 Wrapper :: NoRefs
657+ | Wrapper :: NoFrom
644658 | Wrapper :: Hex
645659 | Wrapper :: Exp
646660 | Wrapper :: NumberFmt
@@ -1006,7 +1020,13 @@ pub(crate) fn inner(input: DeriveInput) -> Result<TokenStream2> {
10061020
10071021 let ( field, from) = get_params ( & input) ?;
10081022
1009- let wrappers = get_wrappers :: < Wrapper > ( & input) ?;
1023+ let mut wrappers = get_wrappers :: < Wrapper > ( & input) ?;
1024+ if wrappers. contains ( & Wrapper :: NoFrom ) {
1025+ wrappers = wrappers
1026+ . into_iter ( )
1027+ . filter ( |w| * w != Wrapper :: From && * w != Wrapper :: NoFrom )
1028+ . collect ( ) ;
1029+ }
10101030 let wrapper_derive = wrappers
10111031 . iter ( )
10121032 . map ( |w| w. into_token_stream2 ( & input, & from, & field) ) ;
@@ -1027,14 +1047,6 @@ pub(crate) fn inner(input: DeriveInput) -> Result<TokenStream2> {
10271047 }
10281048 }
10291049
1030- #[ automatically_derived]
1031- impl #impl_generics #amplify_crate:: FromInner for #ident_name #ty_generics #where_clause {
1032- #[ inline]
1033- fn from_inner( inner: Self :: Inner ) -> Self {
1034- Self :: from( inner)
1035- }
1036- }
1037-
10381050 #[ automatically_derived]
10391051 impl #impl_generics :: core:: convert:: From <#ident_name #ty_generics> for #from #where_clause {
10401052 #[ inline]
0 commit comments