Skip to content

Commit 91f5044

Browse files
committed
wrapper: allow to skip From and InnerFrom implementation
1 parent 71b5ba4 commit 91f5044

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -750,12 +750,12 @@ pub fn derive_getters(input: TokenStream) -> TokenStream {
750750
/// assert_eq!(w.into_inner(), HashMap::<usize, Vec<u8>>::default());
751751
/// ```
752752
///
753-
/// Wrappers for indexable types
753+
/// Wrappers for indexable types, which do not allow explicit construction using `From` converters:
754754
/// ```
755755
/// # #[macro_use] extern crate amplify_derive;
756756
///
757-
/// #[derive(Wrapper, From)]
758-
/// #[wrapper(Index, RangeOps)]
757+
/// #[derive(Wrapper)]
758+
/// #[wrapper(NoFrom, Index, RangeOps)]
759759
/// struct VecNewtype(Vec<u8>);
760760
/// ```
761761
#[proc_macro_derive(Wrapper, attributes(wrap, wrapper, amplify_crate))]

src/wrapper.rs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ const EXAMPLE: &str = r#"#[wrapper(LowerHex, Add)]"#;
2727
#[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Debug)]
2828
enum 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

Comments
 (0)