css_dataset 0.3.0

CSS dataset about functions, properties, etc.
Documentation
use serde::Deserialize;
use std::{collections::HashMap, env, error::Error, fs, iter};

fn main() -> Result<(), Box<dyn Error>> {
    generate_properties()?;
    generate_properties_shorthand()?;
    generate_functions()?;
    generate_svg_tags()?;

    Ok(())
}

fn generate_properties() -> Result<(), Box<dyn Error>> {
    println!("cargo:rerun-if-changed=vendor/css-properties/data/all.json");

    #[derive(Deserialize)]
    struct Data {
        properties: Vec<String>,
    }

    let data = serde_json::from_str::<Data>(&fs::read_to_string(format!(
        "{}/vendor/css-properties/data/all.json",
        env::var("CARGO_MANIFEST_DIR")?
    ))?)?;

    let mut set = phf_codegen::Set::new();
    data.properties.into_iter().for_each(|property| {
        set.entry(property);
    });

    fs::write(
        format!("{}/css_properties.rs", env::var("OUT_DIR")?),
        set.build().to_string(),
    )?;

    Ok(())
}

fn generate_properties_shorthand() -> Result<(), Box<dyn Error>> {
    println!("cargo:rerun-if-changed=vendor/properties-shorthand.json");

    let data =
        serde_json::from_str::<HashMap<String, Vec<String>>>(&fs::read_to_string(format!(
            "{}/vendor/properties-shorthand.json",
            env::var("CARGO_MANIFEST_DIR")?
        ))?)?;

    fs::write(
        format!("{}/css_properties_shorthand.rs", env::var("OUT_DIR")?),
        iter::once(format!(
            "{{\nlet mut map = ahash::AHashMap::with_capacity({});\n",
            data.len()
        ))
        .chain(data.into_iter().flat_map(|(key, value)| {
            iter::once(format!(
                "map.insert(\"{key}\", {{\nlet mut vec = Vec::with_capacity({});\n",
                value.len()
            ))
            .chain(
                value
                    .into_iter()
                    .map(|property| format!("vec.push(\"{property}\");\n")),
            )
            .chain(iter::once("vec\n});".to_string()))
        }))
        .chain(iter::once("map\n}".to_string()))
        .collect::<String>(),
    )?;

    Ok(())
}

fn generate_functions() -> Result<(), Box<dyn Error>> {
    println!("cargo:rerun-if-changed=vendor/css-functions/index.json");

    let data = serde_json::from_str::<Vec<String>>(&fs::read_to_string(format!(
        "{}/vendor/css-functions/index.json",
        env::var("CARGO_MANIFEST_DIR")?
    ))?)?;

    let mut set = phf_codegen::Set::new();
    data.into_iter().for_each(|function| {
        set.entry(function);
    });
    fs::write(
        format!("{}/css_functions.rs", env::var("OUT_DIR")?),
        set.build().to_string(),
    )?;

    Ok(())
}

fn generate_svg_tags() -> Result<(), Box<dyn Error>> {
    println!("cargo:rerun-if-changed=vendor/svg-tags/lib/svg-tags.json");

    let data = serde_json::from_str::<Vec<String>>(&fs::read_to_string(format!(
        "{}/vendor/svg-tags/lib/svg-tags.json",
        env::var("CARGO_MANIFEST_DIR")?
    ))?)?;

    let mut set = phf_codegen::Set::new();
    data.into_iter().for_each(|tag| {
        set.entry(tag);
    });

    fs::write(
        format!("{}/svg_tags.rs", env::var("OUT_DIR")?),
        set.build().to_string(),
    )?;

    Ok(())
}