genify 0.0.5

Turn one file into a complete project
Documentation
use serde::{Deserialize, Serialize};

pub fn parse_toml(raw: &str) -> Result<crate::Config, toml::de::Error> {
    Ok(Config::parse(raw)?.into())
}

#[derive(Clone, Serialize, Deserialize, Debug)]
pub(crate) struct Config {
    #[serde(default)]
    pub props: toml::map::Map<String, toml::Value>,
    #[serde(default)]
    pub rules: Vec<crate::schema::Rule>,
}

impl Config {
    pub(crate) fn parse(raw: &str) -> Result<Self, toml::de::Error> {
        toml::from_str(raw)
    }
}

impl From<Config> for crate::Config {
    fn from(value: Config) -> Self {
        Self {
            props: value
                .props
                .into_iter()
                .map(|(k, v)| (k, v.into()))
                .collect(),
            rules: value.rules,
        }
    }
}

impl From<toml::Value> for crate::Value {
    fn from(value: toml::Value) -> Self {
        match value {
            toml::Value::String(v) => crate::Value::String(v),
            toml::Value::Integer(v) => crate::Value::Integer(v),
            toml::Value::Float(v) => crate::Value::Float(v),
            toml::Value::Boolean(v) => crate::Value::Boolean(v),
            toml::Value::Datetime(datetime) => crate::Value::String(datetime.to_string()),
            toml::Value::Array(vec) => {
                crate::Value::Array(vec.into_iter().map(|v| v.into()).collect())
            }
            toml::Value::Table(map) => {
                crate::Value::Map(map.into_iter().map(|(k, v)| (k, v.into())).collect())
            }
        }
    }
}