1use std::path::PathBuf;
2
3use crate::paths;
4
5#[derive(Debug)]
6pub enum PromptTemplateError {
7 PromptsDirNotFound,
8 TemplateMissing { path: PathBuf },
9 ReadFailed { path: PathBuf },
10}
11
12pub fn resolve_prompts_dir() -> Option<PathBuf> {
13 let zdotdir = paths::resolve_zdotdir()?;
14 let primary = zdotdir.join("prompts");
15 if primary.is_dir() {
16 return Some(primary);
17 }
18
19 let feature_dir = paths::resolve_feature_dir()?;
20 let fallback = feature_dir.join("prompts");
21 if fallback.is_dir() {
22 return Some(fallback);
23 }
24
25 None
26}
27
28pub fn read_template(template_name: &str) -> Result<(PathBuf, String), PromptTemplateError> {
29 let prompts_dir = resolve_prompts_dir().ok_or(PromptTemplateError::PromptsDirNotFound)?;
30 let path = prompts_dir.join(format!("{template_name}.md"));
31
32 if !path.is_file() {
33 return Err(PromptTemplateError::TemplateMissing { path });
34 }
35
36 let content = std::fs::read_to_string(&path)
37 .map_err(|_| PromptTemplateError::ReadFailed { path: path.clone() })?;
38 Ok((path, content))
39}