Skip to content

Commit 9690611

Browse files
committed
Derive Num for newtypes
1 parent c2b7ff0 commit 9690611

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

src/lib.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,3 +503,19 @@ pub fn one(input: TokenStream) -> TokenStream {
503503
}
504504
}).into()
505505
}
506+
507+
#[proc_macro_derive(Num)]
508+
pub fn num(input: TokenStream) -> TokenStream {
509+
let ast: syn::DeriveInput = syn::parse(input).unwrap();
510+
let name = &ast.ident;
511+
let inner_ty = newtype_inner(&ast.data).expect(NEWTYPE_ONLY);
512+
dummy_const_trick("Num", &name, quote! {
513+
extern crate num_traits as _num_traits;
514+
impl _num_traits::Num for #name {
515+
type FromStrRadixErr = <#inner_ty as _num_traits::Num>::FromStrRadixErr;
516+
fn from_str_radix(s: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr> {
517+
<#inner_ty as _num_traits::Num>::from_str_radix(s, radix).map(#name)
518+
}
519+
}
520+
}).into()
521+
}

tests/newtype.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ extern crate num as num_renamed;
22
#[macro_use]
33
extern crate num_derive;
44

5-
use num_renamed::{FromPrimitive, ToPrimitive, NumCast, One, Zero};
5+
use num_renamed::{FromPrimitive, ToPrimitive, NumCast, One, Zero, Num};
66

77
#[derive(
88
Debug,
@@ -16,6 +16,7 @@ use num_renamed::{FromPrimitive, ToPrimitive, NumCast, One, Zero};
1616
NumCast,
1717
One,
1818
Zero,
19+
Num,
1920
)]
2021
struct MyFloat(f64);
2122

@@ -52,3 +53,8 @@ fn test_zero() {
5253
fn test_one() {
5354
assert_eq!(MyFloat::one(), MyFloat(1.0));
5455
}
56+
57+
#[test]
58+
fn test_num() {
59+
assert_eq!(MyFloat::from_str_radix("25", 10).ok(), Some(MyFloat(25.0)));
60+
}

0 commit comments

Comments
 (0)