Skip to content

Commit 2b4c4ca

Browse files
committed
wrapper: allow to skip From and InnerFrom implementation
1 parent 49d6033 commit 2b4c4ca

File tree

3 files changed

+26
-15
lines changed

3 files changed

+26
-15
lines changed

Cargo.lock

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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,
@@ -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

Comments
 (0)