use std::sync::Arc;
use locode_protocol::{ContentBlock, Message, Report};
use locode_provider::Provider;
use locode_tools::Registry;
use tokio_util::sync::CancellationToken;
use crate::config::EngineConfig;
use crate::sink::EventSink;
pub struct Session {
pub(crate) provider: Arc<dyn Provider>,
pub(crate) registry: Registry,
pub(crate) preamble: Vec<Message>,
pub(crate) config: EngineConfig,
pub(crate) sink: Box<dyn EventSink>,
pub(crate) cancel: CancellationToken,
}
impl Session {
#[must_use]
pub fn new(
provider: Arc<dyn Provider>,
registry: Registry,
preamble: Vec<Message>,
config: EngineConfig,
sink: Box<dyn EventSink>,
) -> Self {
Self {
provider,
registry,
preamble,
config,
sink,
cancel: CancellationToken::new(),
}
}
pub async fn run(&mut self, user: Vec<ContentBlock>) -> Report {
self.drive(user).await
}
pub async fn run_text(&mut self, prompt: impl Into<String>) -> Report {
self.run(vec![ContentBlock::Text {
text: prompt.into(),
}])
.await
}
}