Skip to content

Commit 8b47c68

Browse files
committed
Derive Num for newtypes
1 parent 920e504 commit 8b47c68

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
@@ -499,3 +499,19 @@ pub fn one(input: TokenStream) -> TokenStream {
499499
}
500500
}).into()
501501
}
502+
503+
#[proc_macro_derive(Num)]
504+
pub fn num(input: TokenStream) -> TokenStream {
505+
let ast: syn::DeriveInput = syn::parse(input).unwrap();
506+
let name = &ast.ident;
507+
let inner_ty = newtype_inner(&ast.data).expect(NEWTYPE_ONLY);
508+
dummy_const_trick("Num", &name, quote! {
509+
extern crate num_traits as _num_traits;
510+
impl _num_traits::Num for #name {
511+
type FromStrRadixErr = <#inner_ty as _num_traits::Num>::FromStrRadixErr;
512+
fn from_str_radix(s: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr> {
513+
<#inner_ty as _num_traits::Num>::from_str_radix(s, radix).map(#name)
514+
}
515+
}
516+
}).into()
517+
}

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)