use num_traits::Num;
pub fn parse<T: Num>(input: &str) -> Result<T, T::FromStrRadixErr> {
let input = input.trim();
if input.starts_with("0x") {
return T::from_str_radix(input.trim_start_matches("0x"), 16)
}
if input.starts_with("0") {
return T::from_str_radix(input.trim_start_matches("0"), 8)
}
T::from_str_radix(input, 10)
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn usize_dec_turbofish() {
let s = "42";
let u = parse::<usize>(s).unwrap();
assert_eq!(42, u);
}
#[test]
fn usize_dec_deduct() {
let s = "42";
let u = parse(s).unwrap();
assert_eq!(42usize, u);
}
macro_rules! int_parse {
($type:ident, $func_name:ident, $s:literal, $e:literal) => {
#[test]
fn $func_name() {
let u: $type = parse($s).unwrap();
assert_eq!($e, u);
}
}
}
int_parse!(usize, usize_dec, "42", 42);
int_parse!(isize, isize_dec, "42", 42);
int_parse!( u8, u8_dec, "42", 42);
int_parse!( i8, i8_dec, "42", 42);
int_parse!( u16, u16_dec, "42", 42);
int_parse!( i16, i16_dec, "42", 42);
int_parse!( u32, u32_dec, "42", 42);
int_parse!( i32, i32_dec, "42", 42);
int_parse!( u64, u64_dec, "42", 42);
int_parse!( i64, i64_dec, "42", 42);
int_parse!( u128, u128_dec, "42", 42);
int_parse!( i128, i128_dec, "42", 42);
int_parse!(usize, usize_hex, "0x42", 66);
int_parse!(isize, isize_hex, "0x42", 66);
int_parse!( u8, u8_hex, "0x42", 66);
int_parse!( i8, i8_hex, "0x42", 66);
int_parse!( u16, u16_hex, "0x42", 66);
int_parse!( i16, i16_hex, "0x42", 66);
int_parse!( u32, u32_hex, "0x42", 66);
int_parse!( i32, i32_hex, "0x42", 66);
int_parse!( u64, u64_hex, "0x42", 66);
int_parse!( i64, i64_hex, "0x42", 66);
int_parse!( u128, u128_hex, "0x42", 66);
int_parse!( i128, i128_hex, "0x42", 66);
int_parse!(usize, usize_oct, "042", 34);
int_parse!(isize, isize_oct, "042", 34);
int_parse!( u8, u8_oct, "042", 34);
int_parse!( i8, i8_oct, "042", 34);
int_parse!( u16, u16_oct, "042", 34);
int_parse!( i16, i16_oct, "042", 34);
int_parse!( u32, u32_oct, "042", 34);
int_parse!( i32, i32_oct, "042", 34);
int_parse!( u64, u64_oct, "042", 34);
int_parse!( i64, i64_oct, "042", 34);
int_parse!( u128, u128_oct, "042", 34);
int_parse!( i128, i128_oct, "042", 34);
}