use std::sync::Arc;
use wabot_core::injection::Container;
use wabot_feature_agent::{register_agents, Agent, AgentBuilder, AgentFactory, AgentSession};
use wabot_feature_chat_bot::ChatAdapter;
use crate::mock_adapter::MockChatAdapter;
pub struct AgentHarness {
agent: Arc<dyn Agent>,
adapter: Arc<MockChatAdapter>,
factory: Arc<AgentFactory>,
container: Container,
}
impl AgentHarness {
pub fn new(agent: Arc<dyn Agent>) -> Self {
Self::builder(agent).build()
}
pub fn builder(agent: Arc<dyn Agent>) -> AgentHarnessBuilder {
AgentHarnessBuilder {
agent,
container: None,
adapter: None,
}
}
pub fn adapter(&self) -> &Arc<MockChatAdapter> {
&self.adapter
}
pub fn container(&self) -> &Container {
&self.container
}
pub fn factory(&self) -> &Arc<AgentFactory> {
&self.factory
}
pub fn for_agent(&self) -> AgentBuilder {
self.factory.for_agent(self.agent.clone())
}
pub async fn session(&self) -> AgentSession {
self.for_agent().session().await
}
}
pub struct AgentHarnessBuilder {
agent: Arc<dyn Agent>,
container: Option<Container>,
adapter: Option<Arc<MockChatAdapter>>,
}
impl AgentHarnessBuilder {
pub fn container(mut self, container: Container) -> Self {
self.container = Some(container);
self
}
pub fn adapter(mut self, adapter: Arc<MockChatAdapter>) -> Self {
self.adapter = Some(adapter);
self
}
pub fn build(self) -> AgentHarness {
let container = self.container.unwrap_or_default();
let adapter = self.adapter.unwrap_or_else(MockChatAdapter::arc);
let factory = register_agents(&container, adapter.clone() as Arc<dyn ChatAdapter>);
AgentHarness {
agent: self.agent,
adapter,
factory,
container,
}
}
}