in guard/src/rules/values.rs [255:290]
fn try_from(value: &'a serde_json::Value) -> std::result::Result<Self, Self::Error> {
match value {
serde_json::Value::String(s) => Ok(Value::String(s.to_owned())),
serde_json::Value::Number(num) => {
if num.is_i64() {
Ok(Value::Int(num.as_i64().unwrap()))
}
else if num.is_u64() {
//
// Yes we are losing precision here. TODO fix this
//
Ok(Value::Int(num.as_u64().unwrap() as i64))
}
else {
Ok(Value::Float(num.as_f64().unwrap()))
}
},
serde_json::Value::Bool(b) => Ok(Value::Bool(*b)),
serde_json::Value::Null => Ok(Value::Null),
serde_json::Value::Array(v) => {
let mut result: Vec<Value> = Vec::with_capacity(v.len());
for each in v {
result.push(Value::try_from(each)?)
}
Ok(Value::List(result))
},
serde_json::Value::Object(map) => {
let mut result = IndexMap::with_capacity(map.len());
for (key, value) in map.iter() {
result.insert(key.to_owned(),Value::try_from(value)?);
}
Ok(Value::Map(result))
}
}
}