in guard/src/rules/path_value.rs [245:287]
fn try_from(incoming: (&Value, Path)) -> Result<Self, Self::Error> {
let root = incoming.0;
let path = incoming.1;
match root {
Value::String(s) => Ok(PathAwareValue::String((path, s.to_owned()))),
Value::Int(num) => Ok(PathAwareValue::Int((path, *num))),
Value::Float(flt) => Ok(PathAwareValue::Float((path, *flt))),
Value::Regex(s) => Ok(PathAwareValue::Regex((path, s.clone()))),
Value::Char(c) => Ok(PathAwareValue::Char((path, *c))),
Value::RangeChar(r) => Ok(PathAwareValue::RangeChar((path, r.clone()))),
Value::RangeInt(r) => Ok(PathAwareValue::RangeInt((path, r.clone()))),
Value::RangeFloat(r) => Ok(PathAwareValue::RangeFloat((path, r.clone()))),
Value::Bool(b) => Ok(PathAwareValue::Bool((path, *b))),
Value::Null => Ok(PathAwareValue::Null(path)),
Value::List(v) => {
let mut result: Vec<PathAwareValue> = Vec::with_capacity(v.len());
for (idx, each) in v.iter().enumerate() {
let sub_path = path.extend_usize(idx);
let value = PathAwareValue::try_from((each, sub_path.clone()))?;
result.push(value);
}
Ok(PathAwareValue::List((path, result)))
},
Value::Map(map) => {
let mut keys = Vec::with_capacity(map.len());
let mut values = indexmap::IndexMap::with_capacity(map.len());
for each_key in map.keys() {
let sub_path = path.extend_string(each_key);
let value = PathAwareValue::String((sub_path, each_key.to_string()));
keys.push(value);
}
for (each_key, each_value) in map {
let sub_path = path.extend_string(each_key);
let value = PathAwareValue::try_from((each_value, sub_path))?;
values.insert(each_key.to_owned(), value);
}
Ok(PathAwareValue::Map((path, MapValue{keys, values})))
}
}
}