Skip to main content

llm_optimizer_processor/decision/
error.rs

1//! Decision Engine error types
2
3use thiserror::Error;
4
5/// Result type for Decision Engine operations
6pub type DecisionResult<T> = Result<T, DecisionError>;
7
8/// Error types for the Decision Engine
9#[derive(Error, Debug, Clone, PartialEq)]
10pub enum DecisionError {
11    /// Strategy not found
12    #[error("Strategy not found: {0}")]
13    StrategyNotFound(String),
14
15    /// Invalid decision criteria
16    #[error("Invalid decision criteria: {0}")]
17    InvalidCriteria(String),
18
19    /// Decision validation failed
20    #[error("Decision validation failed: {0}")]
21    ValidationFailed(String),
22
23    /// Insufficient data for decision
24    #[error("Insufficient data: {0}")]
25    InsufficientData(String),
26
27    /// Constraint violation
28    #[error("Constraint violation: {0}")]
29    ConstraintViolation(String),
30
31    /// Configuration error
32    #[error("Configuration error: {0}")]
33    ConfigError(String),
34
35    /// Execution error
36    #[error("Execution error: {0}")]
37    ExecutionError(String),
38
39    /// Rollback failed
40    #[error("Rollback failed: {0}")]
41    RollbackFailed(String),
42
43    /// Strategy conflict
44    #[error("Strategy conflict: {0}")]
45    StrategyConflict(String),
46
47    /// Timeout
48    #[error("Decision timeout after {0}ms")]
49    Timeout(u64),
50
51    /// Not running
52    #[error("Decision engine is not running")]
53    NotRunning,
54
55    /// Invalid state transition
56    #[error("Invalid state transition from {from:?} to {to:?}")]
57    InvalidStateTransition {
58        from: DecisionState,
59        to: DecisionState,
60    },
61
62    /// Internal error
63    #[error("Internal error: {0}")]
64    Internal(String),
65}
66
67/// Decision Engine state
68#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
69pub enum DecisionState {
70    /// Initialized but not started
71    Initialized,
72    /// Starting up
73    Starting,
74    /// Running and processing decisions
75    Running,
76    /// Draining before shutdown
77    Draining,
78    /// Stopped
79    Stopped,
80    /// Failed state
81    Failed,
82}
83
84impl DecisionState {
85    /// Check if the state allows processing decisions
86    pub fn can_process(&self) -> bool {
87        matches!(self, DecisionState::Running)
88    }
89
90    /// Check if transition to another state is valid
91    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}