vize_musea 0.178.0

Musea - Component gallery and documentation for Vize Vue components
Documentation
use serde_json::Value;
use vize_carton::{String, append, appends};

use super::types::TokenCategory;

pub fn generate_tokens_markdown(
    categories: &[TokenCategory],
    generated_at: Option<&str>,
) -> String {
    let mut markdown = String::new("");
    appends!(markdown, "# Design Tokens\n");
    if let Some(generated_at) = generated_at {
        appends!(markdown, "\n> Generated by Musea on ", generated_at, "\n");
    }

    for category in categories {
        render_category(&mut markdown, category, 2);
    }
    markdown
}

fn render_category(markdown: &mut String, category: &TokenCategory, level: usize) {
    markdown.push('\n');
    for _ in 0..level {
        markdown.push('#');
    }
    appends!(markdown, " ", category.name.as_str(), "\n\n");

    if !category.tokens.is_empty() {
        appends!(
            markdown,
            "| Token | Value | Description |\n",
            "|-------|-------|-------------|\n"
        );
        for (name, token) in &category.tokens {
            appends!(markdown, "| `", name.as_str(), "` | `");
            append_value(markdown, &token.value);
            appends!(markdown, "` | ");
            if let Some(description) = &token.description {
                markdown.push_str(description);
            } else {
                markdown.push('-');
            }
            appends!(markdown, " |\n");
        }
        markdown.push('\n');
    }

    for subcategory in &category.subcategories {
        render_category(markdown, subcategory, level + 1);
    }
}

fn append_value(mut markdown: &mut String, value: &Value) {
    if let Some(value) = value.as_str() {
        markdown.push_str(value);
    } else if let Some(value) = value.as_i64() {
        append!(markdown, "{value}");
    } else if let Some(value) = value.as_u64() {
        append!(markdown, "{value}");
    } else if let Some(value) = value.as_f64() {
        append!(markdown, "{value}");
    } else {
        append!(markdown, "{value}");
    }
}