rusty_beads/types/
agent.rs1use serde::{Deserialize, Serialize};
4use std::fmt;
5use std::str::FromStr;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
9#[serde(rename_all = "snake_case")]
10pub enum AgentState {
11 #[default]
13 Idle,
14 Spawning,
16 Running,
18 Working,
20 Stuck,
22 Done,
24 Stopped,
26 Dead,
28}
29
30impl AgentState {
31 pub fn as_str(&self) -> &'static str {
33 match self {
34 AgentState::Idle => "idle",
35 AgentState::Spawning => "spawning",
36 AgentState::Running => "running",
37 AgentState::Working => "working",
38 AgentState::Stuck => "stuck",
39 AgentState::Done => "done",
40 AgentState::Stopped => "stopped",
41 AgentState::Dead => "dead",
42 }
43 }
44
45 pub fn is_active(&self) -> bool {
47 matches!(
48 self,
49 AgentState::Spawning | AgentState::Running | AgentState::Working
50 )
51 }
52
53 pub fn is_terminal(&self) -> bool {
55 matches!(self, AgentState::Done | AgentState::Stopped | AgentState::Dead)
56 }
57}
58
59impl fmt::Display for AgentState {
60 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
61 write!(f, "{}", self.as_str())
62 }
63}
64
65impl FromStr for AgentState {
66 type Err = String;
67
68 fn from_str(s: &str) -> Result<Self, Self::Err> {
69 match s.to_lowercase().as_str() {
70 "idle" => Ok(AgentState::Idle),
71 "spawning" => Ok(AgentState::Spawning),
72 "running" => Ok(AgentState::Running),
73 "working" => Ok(AgentState::Working),
74 "stuck" => Ok(AgentState::Stuck),
75 "done" => Ok(AgentState::Done),
76 "stopped" => Ok(AgentState::Stopped),
77 "dead" => Ok(AgentState::Dead),
78 _ => Err(format!("unknown agent state: {}", s)),
79 }
80 }
81}
82
83#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default)]
85#[serde(rename_all = "snake_case")]
86pub enum MolType {
87 Swarm,
89 Patrol,
91 #[default]
93 Work,
94}
95
96impl MolType {
97 pub fn as_str(&self) -> &'static str {
99 match self {
100 MolType::Swarm => "swarm",
101 MolType::Patrol => "patrol",
102 MolType::Work => "work",
103 }
104 }
105}
106
107impl fmt::Display for MolType {
108 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
109 write!(f, "{}", self.as_str())
110 }
111}
112
113impl FromStr for MolType {
114 type Err = String;
115
116 fn from_str(s: &str) -> Result<Self, Self::Err> {
117 match s.to_lowercase().as_str() {
118 "swarm" => Ok(MolType::Swarm),
119 "patrol" => Ok(MolType::Patrol),
120 "work" => Ok(MolType::Work),
121 _ => Err(format!("unknown molecule type: {}", s)),
122 }
123 }
124}