use serde::Deserialize;
use super::Assets;
#[derive(Debug, Clone)]
pub struct HelpTab {
pub name: String,
pub content: String,
}
#[derive(Deserialize)]
struct HelpFrontmatter {
name: String,
order: u32,
}
pub fn load_help_tabs() -> Vec<HelpTab> {
let mut tabs: Vec<(u32, HelpTab)> = Vec::new();
for filename in Assets::iter() {
let filename = filename.as_ref();
if !filename.starts_with("help/") || !filename.ends_with(".md") {
continue;
}
let asset = match Assets::get(filename) {
Some(a) => a,
None => continue,
};
let content = String::from_utf8_lossy(&asset.data);
if let Some((fm_str, body)) = split_help_frontmatter(&content)
&& let Ok(fm) = serde_yaml::from_str::<HelpFrontmatter>(&fm_str)
{
tabs.push((
fm.order,
HelpTab {
name: fm.name,
content: body,
},
));
}
}
tabs.sort_by_key(|(order, _)| *order);
tabs.into_iter().map(|(_, tab)| tab).collect()
}
fn split_help_frontmatter(content: &str) -> Option<(String, String)> {
let trimmed = content.trim_start();
if !trimmed.starts_with("---") {
return None;
}
let after_first = &trimmed[3..];
let end = after_first.find("\n---")?;
let fm = after_first[..end].trim().to_string();
let body = after_first[end + 4..].trim_start().to_string();
Some((fm, body))
}