pub struct BundledFile {
pub path: &'static str,
pub contents: &'static str,
}
pub const BUNDLED_FILES: &[BundledFile] = &[BundledFile {
path: "skillflag/SKILL.md",
contents: include_str!("../skills/skillflag/SKILL.md"),
}];
pub fn skill_ids() -> Vec<&'static str> {
let mut ids: Vec<&'static str> = Vec::new();
for file in BUNDLED_FILES {
if let Some((top, rest)) = file.path.split_once('/') {
if rest == "SKILL.md" && !ids.contains(&top) {
ids.push(top);
}
}
}
ids.sort_unstable();
ids
}
pub fn has_skill(id: &str) -> bool {
skill_md(id).is_some()
}
pub fn skill_md(id: &str) -> Option<&'static str> {
BUNDLED_FILES.iter().find_map(|file| {
let (top, rest) = file.path.split_once('/')?;
(top == id && rest == "SKILL.md").then_some(file.contents)
})
}
pub fn files_for(id: &str) -> Vec<&'static BundledFile> {
BUNDLED_FILES
.iter()
.filter(|file| file.path.split_once('/').is_some_and(|(top, _)| top == id))
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn bundled_skillflag_skill_is_present() {
assert_eq!(skill_ids(), vec!["skillflag"]);
assert!(has_skill("skillflag"));
assert!(!has_skill("nope"));
assert!(skill_md("skillflag").unwrap().contains("name: skillflag"));
assert_eq!(files_for("skillflag").len(), 1);
}
}