use crate::error::Result;
use std::marker::PhantomData;
pub struct Idle;
pub struct Working;
pub struct Reviewing;
pub struct Completed;
pub struct Agent<State> {
id: String,
name: String,
_state: PhantomData<State>,
}
impl Agent<Idle> {
pub fn new(id: String, name: String) -> Self {
Agent {
id,
name,
_state: PhantomData,
}
}
pub fn start_work(self, _task: Task) -> Result<Agent<Working>> {
tracing::info!("Agent {} starting work on task", self.id);
Ok(Agent {
id: self.id,
name: self.name,
_state: PhantomData,
})
}
}
impl Agent<Working> {
pub fn submit_for_review(self) -> Agent<Reviewing> {
tracing::info!("Agent {} submitting work for review", self.id);
Agent {
id: self.id,
name: self.name,
_state: PhantomData,
}
}
pub fn cancel(self) -> Agent<Idle> {
tracing::warn!("Agent {} work cancelled", self.id);
Agent {
id: self.id,
name: self.name,
_state: PhantomData,
}
}
}
impl Agent<Reviewing> {
pub fn approve(self) -> Agent<Completed> {
tracing::info!("Agent {} work approved", self.id);
Agent {
id: self.id,
name: self.name,
_state: PhantomData,
}
}
pub fn request_changes(self) -> Agent<Working> {
tracing::info!("Agent {} needs to address review comments", self.id);
Agent {
id: self.id,
name: self.name,
_state: PhantomData,
}
}
}
impl Agent<Completed> {
pub fn reset(self) -> Agent<Idle> {
tracing::info!("Agent {} resetting to idle", self.id);
Agent {
id: self.id,
name: self.name,
_state: PhantomData,
}
}
}
impl<State> Agent<State> {
pub fn id(&self) -> &str {
&self.id
}
pub fn name(&self) -> &str {
&self.name
}
}
use super::Task;