matterhorn 0.1.6

A lenient front matter parsing crate that supports files prefixed with YAML, JSON, and TOML front matter.
Documentation
use saphyr::{Scalar, Yaml};

pub fn yaml_to_json(yaml: Yaml) -> Result<serde_json::Value, String> {
    match yaml {
        Yaml::Value(Scalar::FloatingPoint(x)) => Ok(serde_json::Value::from(x.into_inner())),
        Yaml::Value(Scalar::Integer(x)) => Ok(serde_json::Value::from(x)),
        Yaml::Value(Scalar::String(x)) => Ok(serde_json::Value::from(x)),
        Yaml::Value(Scalar::Boolean(x)) => Ok(serde_json::Value::from(x)),
        Yaml::Value(Scalar::Null) => Ok(serde_json::Value::Null),
        Yaml::Sequence(mut arr) => Ok(serde_json::Value::Array(
            arr.drain(..).map(yaml_to_json).collect::<Result<_, _>>()?,
        )),
        Yaml::Mapping(mut hash) => Ok(serde_json::Value::Object(
            hash.drain()
                .map(|(key, val)| {
                    let key = match key {
                        Yaml::Value(Scalar::Integer(x)) => Ok(x.to_string()),
                        Yaml::Value(Scalar::String(x)) => Ok(x.to_string()),
                        Yaml::Value(Scalar::FloatingPoint(x)) => Ok(x.to_string()),
                        key => Err(format!("Bad key {key:?}")),
                    }?;
                    let val = yaml_to_json(val)?;
                    Ok((key, val))
                })
                .collect::<Result<_, String>>()?,
        )),
        Yaml::BadValue => Err(format!("Bad value encountered when converting YAML")),
        Yaml::Alias(_) => Err(format!("Unresolved alias encountered when converting YAML")),
        Yaml::Representation(x, _, _) => Err(format!(
            "Encountered unexpected representation when converting YAML: {x:?}"
        )),
        Yaml::Tagged(_, yaml) => yaml_to_json(*yaml),
    }
}