use std::io;
use thiserror::Error;
#[derive(Error, Debug, Clone, PartialEq)] pub enum StateError {
#[error("State not found: {0}")]
StateNotFound(String),
#[error("Event not handled: {0}")]
EventNotHandled(String),
#[error("Invalid configuration: {0}")]
InvalidConfiguration(String),
#[error("Invalid transition definition: {0}")] InvalidTransitionDefinition(String),
#[error("Guard condition failed for event '{event}' in state '{state}'")]
GuardFailed { state: String, event: String },
#[error("Action execution failed: {0}")]
ActionFailed(String),
#[error("Serialization error: {0}")]
Serialization(String),
#[error("Deserialization error: {0}")]
Deserialization(String),
#[error("Actor mailbox full for actor: {0}")]
ActorMailboxFull(String),
#[error("Actor stopped: {0}")]
ActorStopped(String),
#[error("Actor internal error: {0}")]
ActorInternalError(String),
#[error("Actor already exists: {0}")]
ActorExists(String),
#[error("Actor not found: {0}")]
ActorNotFound(String),
#[error("Send error: {0}")]
SendError(String),
#[error("Receive error: {0}")]
ReceiveError(String),
#[error("Timeout error")]
TimeoutError,
#[error("I/O error: {0}")]
IoError(String),
#[error("Transition not found from state '{state}' for event '{event}'")]
TransitionNotFound { state: String, event: String },
#[error("Invalid initial state: {0}")]
InvalidInitialState(String),
#[error("Missing initial state for machine: {0}")]
MissingInitialState(String),
#[error("Context access error: {0}")]
ContextError(String),
#[error("Invalid state definition: {0}")]
InvalidStateDefinition(String),
#[error("Operation not supported: {0}")]
UnsupportedOperation(String),
#[error("Concurrency error: {0}")]
ConcurrencyError(String),
#[error("External error: {0}")]
ExternalError(String),
#[error("Invalid state ID type")]
InvalidStateIdType,
#[error("Type mismatch: {0}")]
TypeMismatch(String),
#[error("History state not found for state: {0}")]
HistoryStateNotFound(String),
#[error("Failed to spawn actor task: {0}")]
SpawnError(String),
#[error("Feature not implemented: {0}")]
NotImplemented(String),
#[error("Query error: {0}")]
QueryError(String),
#[error("Unknown error: {0}")]
Other(String),
}
pub type Result<T, E = StateError> = std::result::Result<T, E>;
#[derive(Error, Debug, Clone, PartialEq)]
pub enum AgentError {
#[error("Policy error: {0}")]
PolicyError(String),
#[error("Storage error: {0}")]
StorageError(String),
#[error("Agent configuration error: {0}")]
ConfigurationError(String),
#[error("Invalid operation: {0}")]
InvalidOperation(String),
#[error("Resource not found: {0}")]
NotFound(String),
#[error("Integration error: {0}")]
IntegrationError(String),
#[error("State machine error: {0}")]
MachineError(String),
#[error("Operation not supported: {0}")]
NotSupported(String),
#[error("Internal agent error: {0}")]
InternalError(String),
#[error("Unknown agent error: {0}")]
Other(String),
}
pub type AgentResult<T> = std::result::Result<T, AgentError>;
impl From<serde_json::Error> for StateError {
fn from(err: serde_json::Error) -> Self {
StateError::Serialization(err.to_string())
}
}
impl From<io::Error> for StateError {
fn from(err: io::Error) -> Self {
StateError::IoError(err.to_string())
}
}
impl From<crate::integration::error::Error> for StateError {
fn from(err: crate::integration::error::Error) -> Self {
match err {
crate::integration::error::Error::StateError(e) => e, crate::integration::error::Error::JsonError(e) => {
StateError::Serialization(e.to_string())
} crate::integration::error::Error::LockError => {
StateError::ConcurrencyError("Shared context lock poisoned".to_string())
}
crate::integration::error::Error::Other(s) => StateError::ExternalError(s),
}
}
}