in guard/src/rules/path_value.rs [293:355]
fn try_into(self) -> std::result::Result<(String, serde_json::Value), Self::Error> {
let top = self.self_path().0.clone();
match self {
PathAwareValue::Null(_) => Ok((top, serde_json::Value::Null)),
PathAwareValue::String((_, s)) => Ok((top, serde_json::Value::String(s.clone()))),
PathAwareValue::Regex((_, r)) => Ok((top, serde_json::Value::String(format!("/{}/", r)))),
PathAwareValue::Bool((_, bool_)) => Ok((top, serde_json::Value::Bool(*bool_))),
PathAwareValue::Int((_, i64_)) => Ok((top, serde_json::Value::Number(serde_json::Number::from(*i64_)))),
PathAwareValue::Float((_, f64_)) => Ok((top, serde_json::Value::Number(
match serde_json::Number::from_f64(*f64_) {
Some(num) => num,
None => return Err(Error::new(ErrorKind::IncompatibleError(
format!("Could not convert float {} to serde::Value::Number", *f64_)
)))
}))),
PathAwareValue::Char((_, char_)) => Ok((top, serde_json::Value::String(char_.to_string()))),
PathAwareValue::List((_, list)) => {
let mut values = Vec::with_capacity(list.len());
for each in list {
let (_, val): (String, serde_json::Value) = each.try_into()?;
values.push(val);
}
Ok((top, serde_json::Value::Array(values)))
},
PathAwareValue::Map((_, map)) => {
let mut values = serde_json::Map::new();
for (key, value) in map.values.iter() {
let (_, val): (String, serde_json::Value) = value.try_into()?;
values.insert(key.clone(), val);
}
Ok((top, serde_json::Value::Object(values)))
},
PathAwareValue::RangeFloat((_, range_)) => {
let range_encoding = format!("{}{},{}{}",
if range_.inclusive & LOWER_INCLUSIVE > 0 { "[" } else { "(" },
range_.lower, range_.upper,
if range_.inclusive & UPPER_INCLUSIVE > 0{ "]" } else { ")" },
);
Ok((top, serde_json::Value::String(range_encoding)))
},
PathAwareValue::RangeChar((_, range_)) => {
let range_encoding = format!("{}{},{}{}",
if range_.inclusive & LOWER_INCLUSIVE > 0 { "[" } else { "(" },
range_.lower, range_.upper,
if range_.inclusive & UPPER_INCLUSIVE > 0{ "]" } else { ")" },
);
Ok((top, serde_json::Value::String(range_encoding)))
},
PathAwareValue::RangeInt((_, range_)) => {
let range_encoding = format!("{}{},{}{}",
if range_.inclusive & LOWER_INCLUSIVE > 0 { "[" } else { "(" },
range_.lower, range_.upper,
if range_.inclusive & UPPER_INCLUSIVE > 0{ "]" } else { ")" },
);
Ok((top, serde_json::Value::String(range_encoding)))
},
}
}