fn try_into()

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)))
            },
        }
    }