diff --git a/src/hash.rs b/src/hash.rs index 8c1772b2c..c17b706db 100644 --- a/src/hash.rs +++ b/src/hash.rs @@ -195,6 +195,7 @@ macro_rules! impl_hash { fn from_json(json: &Json) -> Self { match json { &Json::String(ref s) => { + println!("s: {}", s); match s.len() % 2 { 0 => FromStr::from_str(clean_0x(s)).unwrap(), _ => FromStr::from_str(&("0".to_string() + &(clean_0x(s).to_string()))[..]).unwrap() diff --git a/src/json_aid.rs b/src/json_aid.rs index e25e9406d..79a71cac6 100644 --- a/src/json_aid.rs +++ b/src/json_aid.rs @@ -46,6 +46,16 @@ impl FromJson for Vec where T: FromJson { } } +impl FromJson for Option where T: FromJson { + fn from_json(json: &Json) -> Self { + match json { + &Json::String(ref o) if o.is_empty() => None, + &Json::Null => None, + _ => Some(FromJson::from_json(json)), + } + } +} + impl FromJson for u64 { fn from_json(json: &Json) -> Self { U256::from_json(json).low_u64() @@ -77,7 +87,7 @@ fn u256_from_json() { } #[test] -fn h256_from_json_() { +fn h256_from_json() { let j = Json::from_str("{ \"with\": \"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\", \"without\": \"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\" }").unwrap(); let v: H256 = xjson!(&j["with"]); @@ -95,9 +105,33 @@ fn vec_u256_from_json() { } #[test] -fn vec_h256_from_json_() { +fn vec_h256_from_json() { let j = Json::from_str("{ \"array\": [ \"1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\", \"0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\"] }").unwrap(); let v: Vec = xjson!(&j["array"]); assert_eq!(vec![H256::from_str("1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef").unwrap(); 2], v); } + +#[test] +fn simple_types() { + let j = Json::from_str("{ \"null\": null, \"empty\": \"\", \"int\": 42, \"dec\": \"42\", \"hex\": \"0x2a\" }").unwrap(); + let v: u16 = xjson!(&j["int"]); + assert_eq!(42u16, v); + let v: u32 = xjson!(&j["dec"]); + assert_eq!(42u32, v); + let v: u64 = xjson!(&j["hex"]); + assert_eq!(42u64, v); +} + +#[test] +fn option_types() { + let j = Json::from_str("{ \"null\": null, \"empty\": \"\", \"int\": 42, \"dec\": \"42\", \"hex\": \"0x2a\" }").unwrap(); + let v: Option = xjson!(&j["int"]); + assert_eq!(Some(42u16), v); + let v: Option = xjson!(&j["dec"]); + assert_eq!(Some(42u16), v); + let v: Option = xjson!(&j["null"]); + assert_eq!(None, v); + let v: Option = xjson!(&j["empty"]); + assert_eq!(None, v); +} \ No newline at end of file