Skip to main content

coda_pm/
lib.rs

1//! CODA Prompt Manager
2//!
3//! A template-based prompt management system using minijinja. Supports
4//! loading `.j2` template files from directories and rendering them with
5//! structured context data.
6//!
7//! # Usage
8//!
9//! ```
10//! use coda_pm::{PromptManager, PromptTemplate};
11//!
12//! let mut pm = PromptManager::new();
13//! pm.add_template(PromptTemplate::new("greeting", "Hello, {{ name }}!")).unwrap();
14//! let rendered = pm.render("greeting", minijinja::context!(name => "World")).unwrap();
15//! assert_eq!(rendered, "Hello, World!");
16//! ```
17
18pub mod builtin;
19mod error;
20pub mod loader;
21mod manager;
22mod template;
23
24pub use error::PromptError;
25pub use manager::PromptManager;
26pub use template::PromptTemplate;
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn test_prompt_manager_render() {
34        let mut pm = PromptManager::new();
35        let template = PromptTemplate::new("greeting", "Hello, {{ name }}!");
36        pm.add_template(template).unwrap();
37
38        let result = pm
39            .render("greeting", minijinja::context!(name => "World"))
40            .unwrap();
41        assert_eq!(result, "Hello, World!");
42    }
43
44    #[test]
45    fn test_should_load_all_builtin_templates_via_with_builtin_templates() {
46        let pm = PromptManager::with_builtin_templates().unwrap();
47        assert_eq!(pm.template_count(), builtin::BUILTIN_TEMPLATE_COUNT);
48
49        // Verify a sample of templates are accessible by name
50        assert!(pm.get_template("init/system").is_some());
51        assert!(pm.get_template("run/dev_phase").is_some());
52        assert!(pm.get_template("plan/approve").is_some());
53    }
54
55    #[test]
56    fn test_should_render_builtin_template() {
57        let pm = PromptManager::with_builtin_templates().unwrap();
58
59        // init/system takes no variables, so we can render it with empty context
60        let result = pm.render("init/system", minijinja::context!());
61        assert!(result.is_ok(), "Failed to render init/system: {result:?}");
62        assert!(!result.unwrap().is_empty());
63    }
64}