use crate::model::SkillLoadOutcome;
use tokio::fs;
use super::instructions::SkillInstructions;
#[derive(Debug, Default)]
pub struct SkillInjections {
pub items: Vec<SkillInstructions>,
pub warnings: Vec<String>,
}
pub async fn build_skill_injections(skill_names: &[String], skills: Option<&SkillLoadOutcome>) -> SkillInjections {
if skill_names.is_empty() {
return SkillInjections::default();
}
let Some(outcome) = skills else {
return SkillInjections::default();
};
let mut result = SkillInjections {
items: Vec::with_capacity(skill_names.len()),
warnings: Vec::new(),
};
for name in skill_names {
if let Some(skill) = outcome.skills.iter().find(|s| s.name == *name) {
match fs::read_to_string(&skill.path).await {
Ok(contents) => {
result.items.push(SkillInstructions {
name: skill.name.clone(),
path: skill.path.clone(),
contents,
});
}
Err(err) => {
let message = format!("Failed to load skill {} at {}: {err:#}", skill.name, skill.path.display());
result.warnings.push(message);
}
}
}
}
result
}