use std::{collections::HashMap, path::PathBuf};
use super::{
builtin::loaded_builtins,
model::{Directive, MAX_DIRECTIVE_CHARS},
};
pub fn load_directives(dir:&PathBuf) -> HashMap<String, Directive> {
let entries = match std::fs::read_dir(dir) {
Ok(entries) => entries,
Err(e) => {
tracing::warn!(
directive_source = "builtins",
path = %dir.display(),
error = %e,
"directives directory missing or unreadable; falling back to built-in directives"
);
return loaded_builtins();
},
};
let mut directives = HashMap::new();
for entry in entries.flatten() {
let path = entry.path();
if path.extension().map(|e| e != "md").unwrap_or(true) {
continue;
}
let Some(name) = path.file_stem().and_then(|n| n.to_str()) else {
continue;
};
let Ok(content) = std::fs::read_to_string(&path) else {
continue;
};
let content = if content.len() > MAX_DIRECTIVE_CHARS {
let trunc:String = content.chars().take(MAX_DIRECTIVE_CHARS).collect();
format!("{}…", trunc)
} else {
content
};
directives.insert(name.to_string(), Directive { name:name.to_string(), content });
}
tracing::info!(
directive_source = "disk",
path = %dir.display(),
count = directives.len(),
"loaded {} directive(s) from disk",
directives.len()
);
if directives.is_empty() {
tracing::info!(
directive_source = "disk",
path = %dir.display(),
"directives directory exists but contains no readable .md files - treating as intentionally empty"
);
}
directives
}