@@ -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 ,
@@ -126,7 +128,7 @@ impl FromPath for Wrapper {
126128 const DERIVE : & ' static str = "Wrapper" ;
127129 const NO_REFS : Self = Self :: NoRefs ;
128130
129- fn default_set ( ) -> Vec < Self > { vec ! [ Wrapper :: AsRef , Wrapper :: Borrow ] }
131+ fn default_set ( ) -> Vec < Self > { vec ! [ Wrapper :: From , Wrapper :: AsRef , Wrapper :: Borrow ] }
130132
131133 fn is_not_ref ( & self ) -> bool { * self != Wrapper :: AsRef && * self != Wrapper :: Borrow }
132134
@@ -135,6 +137,8 @@ impl FromPath for Wrapper {
135137 Err ( attr_err ! ( path. span( ) , NAME , "must contain at least one identifier" , EXAMPLE ) ) ,
136138 |segment| {
137139 Ok ( match segment. ident . to_string ( ) . as_str ( ) {
140+ "From" => Some ( Wrapper :: From ) ,
141+ "NoFrom" => Some ( Wrapper :: NoFrom ) ,
138142 "FromStr" => Some ( Wrapper :: FromStr ) ,
139143 "Display" => Some ( Wrapper :: Display ) ,
140144 "Debug" => Some ( Wrapper :: Debug ) ,
@@ -243,6 +247,15 @@ impl Wrapper {
243247 let amplify_crate = get_amplify_crate ( input) ;
244248
245249 match self {
250+ Wrapper :: From => quote ! {
251+ #[ automatically_derived]
252+ impl #impl_generics #amplify_crate:: FromInner for #ident_name #ty_generics #where_clause {
253+ #[ inline]
254+ fn from_inner( inner: Self :: Inner ) -> Self {
255+ Self :: from( inner)
256+ }
257+ }
258+ } ,
246259 Wrapper :: FromStr => quote ! {
247260 #[ automatically_derived]
248261 impl #impl_generics :: core:: str :: FromStr for #ident_name #ty_generics #where_clause
@@ -637,6 +650,7 @@ impl Wrapper {
637650 }
638651 } ,
639652 Wrapper :: NoRefs |
653+ Wrapper :: NoFrom |
640654 Wrapper :: Hex |
641655 Wrapper :: Exp |
642656 Wrapper :: NumberFmt |
@@ -998,7 +1012,13 @@ pub(crate) fn inner(input: DeriveInput) -> Result<TokenStream2> {
9981012
9991013 let ( field, from) = get_params ( & input) ?;
10001014
1001- let wrappers = get_wrappers :: < Wrapper > ( & input) ?;
1015+ let mut wrappers = get_wrappers :: < Wrapper > ( & input) ?;
1016+ if wrappers. contains ( & Wrapper :: NoFrom ) {
1017+ wrappers = wrappers
1018+ . into_iter ( )
1019+ . filter ( |w| * w != Wrapper :: From && * w != Wrapper :: NoFrom )
1020+ . collect ( ) ;
1021+ }
10021022 let wrapper_derive = wrappers
10031023 . iter ( )
10041024 . map ( |w| w. into_token_stream2 ( & input, & from, & field) ) ;
@@ -1019,14 +1039,6 @@ pub(crate) fn inner(input: DeriveInput) -> Result<TokenStream2> {
10191039 }
10201040 }
10211041
1022- #[ automatically_derived]
1023- impl #impl_generics #amplify_crate:: FromInner for #ident_name #ty_generics #where_clause {
1024- #[ inline]
1025- fn from_inner( inner: Self :: Inner ) -> Self {
1026- Self :: from( inner)
1027- }
1028- }
1029-
10301042 #[ automatically_derived]
10311043 impl #impl_generics :: core:: convert:: From <#ident_name #ty_generics> for #from #where_clause {
10321044 #[ inline]
0 commit comments