use crate::output::Output;
use crate::step::Step;
use crate::traits;
use crate::traits::ExecutorError;
use crate::Parameters;
pub struct Frame<'l, E>
where
E: traits::Executor,
{
executor: &'l E,
step: &'l Step,
}
impl<'l, E> Frame<'l, E>
where
E: traits::Executor,
{
pub fn new(executor: &'l E, step: &'l Step) -> Self {
Self { executor, step }
}
pub async fn format_and_execute(
&self,
parameters: &Parameters,
) -> Result<Output, FormatAndExecuteError> {
let prompt = self.step.format(parameters)?;
Ok(self.executor.execute(self.step.options(), &prompt).await?)
}
}
#[derive(Debug, thiserror::Error)]
pub enum FormatAndExecuteError {
#[error("Error formatting: {0}")]
Format(#[from] crate::prompt::StringTemplateError),
#[error("Error executing: {0}")]
Execute(#[from] ExecutorError),
}