use alloc::{string::String, sync::Arc};
use crate::task::{Response, Task};
#[cfg(feature = "std")]
pub mod openai;
pub trait Executor {
fn default_model(&self) -> &Arc<Option<String>>;
fn execute(&self, task: Task) -> impl Future<Output = anyhow::Result<Response>>;
}
#[derive(Debug, Clone)]
pub struct DummyExecutor {
success: bool,
default_model: String,
arc_default_model: Arc<Option<String>>,
}
impl Default for DummyExecutor {
fn default() -> Self {
let success = true;
let default_model = String::from("dummy");
let arc_default_model = Arc::new(Some(default_model.clone()));
Self {
success,
default_model,
arc_default_model,
}
}
}
impl DummyExecutor {
pub fn set_success(&mut self) {
self.success = true;
}
pub fn set_fail(&mut self) {
self.success = false;
}
}
impl Executor for DummyExecutor {
fn default_model(&self) -> &Arc<Option<String>> {
&self.arc_default_model
}
async fn execute(&self, task: Task) -> anyhow::Result<Response> {
let tokens = 100;
let contents = alloc::format!("{}", task.id);
let model = task
.model
.as_ref()
.cloned()
.unwrap_or_else(|| self.default_model.clone());
let response = if self.success {
Response::success(task, tokens, model, contents)
} else {
Response::error(task, tokens, model, contents)
};
Ok(response)
}
}