Skip to main content

codex_cli/
prompts.rs

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}