use std::{fmt::Debug, sync::Arc};
use arbiter_core::middleware::ArbiterMiddleware;
use serde::{de::DeserializeOwned, Serialize};
use super::*;
use crate::{
machine::{Behavior, Engine, StateMachine},
messager::Messager,
};
#[derive(Debug)]
pub struct Agent {
pub id: String,
pub messager: Messager,
pub client: Arc<ArbiterMiddleware>,
pub(crate) behavior_engines: Vec<Box<dyn StateMachine>>,
}
impl Agent {
pub fn builder(id: &str) -> AgentBuilder {
AgentBuilder {
id: id.to_owned(),
behavior_engines: None,
}
}
}
pub struct AgentBuilder {
pub id: String,
behavior_engines: Option<Vec<Box<dyn StateMachine>>>,
}
impl AgentBuilder {
pub fn with_behavior<E: DeserializeOwned + Serialize + Send + Sync + Debug + 'static>(
mut self,
behavior: impl Behavior<E> + 'static,
) -> Self {
let engine = Engine::new(behavior);
if let Some(engines) = &mut self.behavior_engines {
engines.push(Box::new(engine));
} else {
self.behavior_engines = Some(vec![Box::new(engine)]);
};
self
}
pub(crate) fn with_engine(mut self, engine: Box<dyn StateMachine>) -> Self {
if let Some(engines) = &mut self.behavior_engines {
engines.push(engine);
} else {
self.behavior_engines = Some(vec![engine]);
};
self
}
pub fn build(
self,
client: Arc<ArbiterMiddleware>,
messager: Messager,
) -> Result<Agent, ArbiterEngineError> {
match self.behavior_engines {
Some(engines) => Ok(Agent {
id: self.id,
messager,
client,
behavior_engines: engines,
}),
None => Err(ArbiterEngineError::AgentBuildError(
"Missing behavior engines".to_owned(),
)),
}
}
}