llm_optimizer_processor/decision/
error.rs1use thiserror::Error;
4
5pub type DecisionResult<T> = Result<T, DecisionError>;
7
8#[derive(Error, Debug, Clone, PartialEq)]
10pub enum DecisionError {
11 #[error("Strategy not found: {0}")]
13 StrategyNotFound(String),
14
15 #[error("Invalid decision criteria: {0}")]
17 InvalidCriteria(String),
18
19 #[error("Decision validation failed: {0}")]
21 ValidationFailed(String),
22
23 #[error("Insufficient data: {0}")]
25 InsufficientData(String),
26
27 #[error("Constraint violation: {0}")]
29 ConstraintViolation(String),
30
31 #[error("Configuration error: {0}")]
33 ConfigError(String),
34
35 #[error("Execution error: {0}")]
37 ExecutionError(String),
38
39 #[error("Rollback failed: {0}")]
41 RollbackFailed(String),
42
43 #[error("Strategy conflict: {0}")]
45 StrategyConflict(String),
46
47 #[error("Decision timeout after {0}ms")]
49 Timeout(u64),
50
51 #[error("Decision engine is not running")]
53 NotRunning,
54
55 #[error("Invalid state transition from {from:?} to {to:?}")]
57 InvalidStateTransition {
58 from: DecisionState,
59 to: DecisionState,
60 },
61
62 #[error("Internal error: {0}")]
64 Internal(String),
65}
66
67#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
69pub enum DecisionState {
70 Initialized,
72 Starting,
74 Running,
76 Draining,
78 Stopped,
80 Failed,
82}
83
84impl DecisionState {
85 pub fn can_process(&self) -> bool {
87 matches!(self, DecisionState::Running)
88 }
89
90 pub fn can_transition_to(&self, to: DecisionState) -> bool {
92 use DecisionState::*;
93 matches!(
94 (self, to),
95 (Initialized, Starting)
96 | (Starting, Running)
97 | (Starting, Failed)
98 | (Running, Draining)
99 | (Running, Failed)
100 | (Draining, Stopped)
101 | (Draining, Failed)
102 | (Failed, Initialized)
103 )
104 }
105}