Skip to content

Commit 67ecaa5

Browse files
authored
Merge pull request #143 from greyblake/generics-derive-as-ref
Derive AsRef on newtypes with generics
2 parents 0f79e72 + 5dd4efd commit 67ecaa5

File tree

7 files changed

+40
-8
lines changed

7 files changed

+40
-8
lines changed

examples/any_generics/src/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ struct NotEmpty<T>(Vec<T>);
2020
From,
2121
Deref,
2222
Borrow,
23+
AsRef,
2324
// TODO
24-
// AsRef,
2525
// FromStr,
2626
// TryFrom,
2727
// Default,

nutype_macros/src/any/gen/traits/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ fn gen_implemented_traits(
153153
impl_traits
154154
.iter()
155155
.map(|t| match t {
156-
AnyIrregularTrait::AsRef => Ok(gen_impl_trait_as_ref(type_name, inner_type)),
156+
AnyIrregularTrait::AsRef => Ok(gen_impl_trait_as_ref(type_name, generics, inner_type)),
157157
AnyIrregularTrait::From => Ok(gen_impl_trait_from(type_name, generics, inner_type)),
158158
AnyIrregularTrait::Into => Ok(gen_impl_trait_into(type_name, generics, inner_type.clone())),
159159
AnyIrregularTrait::Display => Ok(gen_impl_trait_display(type_name, generics)),

nutype_macros/src/common/gen/traits.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,13 @@ pub fn gen_impl_trait_into(
7373
}
7474
}
7575

76-
pub fn gen_impl_trait_as_ref(type_name: &TypeName, inner_type: impl ToTokens) -> TokenStream {
76+
pub fn gen_impl_trait_as_ref(
77+
type_name: &TypeName,
78+
generics: &Generics,
79+
inner_type: impl ToTokens,
80+
) -> TokenStream {
7781
quote! {
78-
impl ::core::convert::AsRef<#inner_type> for #type_name {
82+
impl #generics ::core::convert::AsRef<#inner_type> for #type_name #generics {
7983
#[inline]
8084
fn as_ref(&self) -> &#inner_type {
8185
&self.0

nutype_macros/src/float/gen/traits/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ fn gen_implemented_traits<T: ToTokens>(
169169
impl_traits
170170
.iter()
171171
.map(|t| match t {
172-
FloatIrregularTrait::AsRef => Ok(gen_impl_trait_as_ref(type_name, inner_type)),
172+
FloatIrregularTrait::AsRef => Ok(gen_impl_trait_as_ref(type_name, generics, inner_type)),
173173
FloatIrregularTrait::Deref => Ok(gen_impl_trait_deref(type_name, generics, inner_type)),
174174
FloatIrregularTrait::FromStr => {
175175
Ok(gen_impl_trait_from_str(type_name, inner_type, maybe_error_type_name.as_ref()))

nutype_macros/src/integer/gen/traits/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ fn gen_implemented_traits<T: ToTokens>(
189189
impl_traits
190190
.iter()
191191
.map(|t| match t {
192-
IntegerIrregularTrait::AsRef => Ok(gen_impl_trait_as_ref(type_name, inner_type)),
192+
IntegerIrregularTrait::AsRef => Ok(gen_impl_trait_as_ref(type_name, generics, inner_type)),
193193
IntegerIrregularTrait::Deref => Ok(gen_impl_trait_deref(type_name, generics, inner_type)),
194194
IntegerIrregularTrait::FromStr => {
195195
Ok(gen_impl_trait_from_str(type_name, inner_type, maybe_error_type_name.as_ref()))

nutype_macros/src/string/gen/traits/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ fn gen_implemented_traits(
183183
impl_traits
184184
.iter()
185185
.map(|t| match t {
186-
StringIrregularTrait::AsRef => Ok(gen_impl_trait_as_ref(type_name, quote!(str))),
186+
StringIrregularTrait::AsRef => Ok(gen_impl_trait_as_ref(type_name, generics, quote!(str))),
187187
StringIrregularTrait::Deref => Ok(gen_impl_trait_deref(type_name, generics, quote!(String))),
188188
StringIrregularTrait::FromStr => {
189189
Ok(gen_impl_from_str(type_name, maybe_error_type_name.as_ref()))

test_suite/tests/any.rs

+29-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use nutype::nutype;
22
use std::borrow::Cow;
3+
use std::collections::HashMap;
34
use test_suite::test_helpers::traits::*;
45

56
// Inner custom type, which is unknown to nutype
@@ -488,7 +489,7 @@ mod with_generics {
488489
fn test_generic_with_lifetime_cow() {
489490
#[nutype(
490491
validate(predicate = |s| s.len() >= 3),
491-
derive(Debug, Display, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Into, Deref, Borrow, TryFrom)
492+
derive(Debug, Display, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Into, Deref, Borrow, TryFrom, AsRef)
492493
)]
493494
struct Clarabelle<'a>(Cow<'a, str>);
494495

@@ -500,4 +501,31 @@ mod with_generics {
500501
assert_eq!(muu.to_string(), "Muu");
501502
}
502503
}
504+
505+
#[test]
506+
fn test_derive_as_ref_with_generic() {
507+
#[nutype(derive(AsRef))]
508+
struct SquareMap<K, V>(HashMap<K, V>);
509+
510+
let mut inner_map = HashMap::new();
511+
inner_map.insert(4, 16);
512+
inner_map.insert(5, 25);
513+
let squares = SquareMap::new(inner_map.clone());
514+
assert_eq!(squares.as_ref(), &inner_map);
515+
}
516+
517+
#[test]
518+
fn test_derive_as_ref_with_generic_and_validation() {
519+
#[nutype(
520+
validate(predicate = |map| map.len() > 1),
521+
derive(AsRef)
522+
)]
523+
struct NonEmptyMap<K, V>(HashMap<K, V>);
524+
525+
let mut inner_map = HashMap::new();
526+
inner_map.insert(4, 16);
527+
inner_map.insert(5, 25);
528+
let squares = NonEmptyMap::new(inner_map.clone()).unwrap();
529+
assert_eq!(squares.as_ref(), &inner_map);
530+
}
503531
}

0 commit comments

Comments
 (0)