llm 1.3.8

A Rust library unifying multiple LLM backends.
Documentation
use std::fs;
use std::path::Path;

use thiserror::Error;

use super::types::Skill;

#[derive(Debug, Error)]
pub enum SkillError {
    #[error("skills io error: {0}")]
    Io(#[from] std::io::Error),
    #[error("skills parse error: {0}")]
    Parse(#[from] serde_yaml::Error),
}

pub fn load_skills(dir: &Path) -> Result<Vec<Skill>, SkillError> {
    if !dir.exists() {
        return Ok(Vec::new());
    }
    let mut skills = Vec::new();
    for entry in fs::read_dir(dir)? {
        let entry = entry?;
        let path = entry.path();
        let ext = path.extension().and_then(|ext| ext.to_str()).unwrap_or("");
        if ext != "yaml" && ext != "yml" {
            continue;
        }
        let contents = fs::read_to_string(&path)?;
        let mut skill: Skill = serde_yaml::from_str(&contents)?;
        if skill.name.trim().is_empty() {
            if let Some(stem) = path.file_stem().and_then(|v| v.to_str()) {
                skill.name = stem.to_string();
            }
        }
        skills.push(skill);
    }
    Ok(skills)
}