use jsondata::{Json, JsonSerialize};
use std::str::FromStr;
#[derive(Debug, Clone, JsonSerialize)]
struct U8 {
a: u8,
}
#[derive(Debug, Clone, JsonSerialize)]
struct F32 {
a: f32,
}
#[derive(Debug, Clone, JsonSerialize)]
struct F64 {
a: f64,
}
#[derive(Debug, Clone, JsonSerialize)]
struct Data {
a: (u8, u8),
b: (i8, i8),
c: (u16, u16),
d: (i16, i16),
e: (u32, u32),
f: (i32, i32),
g: (u64, u64),
h: (i64, i64),
i: (usize, usize),
j: (isize, isize),
}
fn main() {
let data1 = Data {
a: (0, 255),
b: (-128, 127),
c: (0, 65535),
d: (-32768, 32767),
e: (0, 4294967295),
f: (-2147483648, 2147483647),
g: (0, 18446744073709551615),
h: (-9223372036854775808, 9223372036854775807),
i: (0, 18446744073709551615),
j: (-9223372036854775808, 9223372036854775807),
};
let jval1 = Json::from(data1);
let text = jval1.to_string();
let out = Data::try_from(Json::from_str(&text).unwrap());
assert!(out.is_ok());
println!("{:?}", out.unwrap());
let text = r#"{"a": 256}"#;
let out = U8::try_from(Json::from_str(text).unwrap());
assert!(out.is_err());
let text = r#"{"a": 2.123456789}"#;
let out = F32::try_from(Json::from_str(text).unwrap());
assert!(out.is_ok());
println!("{:?}", out.clone().unwrap());
assert!((out.unwrap().a - 2.123_456_7).abs() < 0.000001);
let texts = [
r#"{"a": 0}"#,
r#"{"a": -128}"#,
r#"{"a": 127}"#,
r#"{"a": 255}"#,
r#"{"a": -32768}"#,
r#"{"a": 32767}"#,
r#"{"a": 65535}"#,
r#"{"a": -2147483648}"#,
r#"{"a": 2147483647}"#,
r#"{"a": 4294967295}"#,
r#"{"a": -9223372036854775808}"#,
r#"{"a": 9223372036854775807}"#,
r#"{"a": 18446744073709551615}"#,
];
for (i, text) in texts.iter().enumerate() {
let out = F64::try_from(Json::from_str(text).unwrap());
match i {
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 => println!("{:?}", out.unwrap()),
_ => assert!(out.is_err()),
}
}
}