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}");
}
}