use serde::Serialize;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum PromptError {
#[error("template syntax error: {0}")]
Syntax(String),
#[error("render error: {0}")]
Render(String),
}
impl From<minijinja::Error> for PromptError {
fn from(e: minijinja::Error) -> Self {
match e.kind() {
minijinja::ErrorKind::SyntaxError => PromptError::Syntax(e.to_string()),
_ => PromptError::Render(e.to_string()),
}
}
}
#[derive(Clone)]
pub struct Prompt {
env: minijinja::Environment<'static>,
name: String,
}
impl Prompt {
pub fn new(source: impl Into<String>) -> Result<Self, PromptError> {
let mut env = minijinja::Environment::new();
env.set_undefined_behavior(minijinja::UndefinedBehavior::Strict);
env.add_template_owned("inline", source.into())?;
Ok(Self {
env,
name: "inline".into(),
})
}
pub fn render<T: Serialize>(&self, vars: &T) -> Result<String, PromptError> {
let tmpl = self.env.get_template(&self.name)?;
Ok(tmpl.render(vars)?)
}
}