use std::fmt;
use std::string::String;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum Error {
EventLog(EventLogError),
Hash(HashError),
State(StateError),
Capability(CapabilityError),
Tool(ToolError),
Serialization(SerializationError),
Validation(ValidationError),
Message(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::EventLog(e) => write!(f, "EventLog: {}", e),
Error::Hash(e) => write!(f, "Hash: {}", e),
Error::State(e) => write!(f, "State: {}", e),
Error::Capability(e) => write!(f, "Capability: {}", e),
Error::Tool(e) => write!(f, "Tool: {}", e),
Error::Serialization(e) => write!(f, "Serialization: {}", e),
Error::Validation(e) => write!(f, "Validation: {}", e),
Error::Message(msg) => write!(f, "{}", msg),
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for Error {}
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum EventLogError {
InvalidEventId(String),
ParentNotFound(String),
HashMismatch { expected: String, actual: String },
CorruptedLog(String),
}
impl fmt::Display for EventLogError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
EventLogError::InvalidEventId(id) => write!(f, "Invalid event ID: {}", id),
EventLogError::ParentNotFound(id) => write!(f, "Parent event not found: {}", id),
EventLogError::HashMismatch { expected, actual } => {
write!(f, "Hash mismatch: expected {}, got {}", expected, actual)
}
EventLogError::CorruptedLog(msg) => write!(f, "Corrupted log: {}", msg),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum HashError {
InvalidFormat(String),
ComputationFailed(String),
}
impl fmt::Display for HashError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
HashError::InvalidFormat(s) => write!(f, "Invalid hash format: {}", s),
HashError::ComputationFailed(s) => write!(f, "Hash computation failed: {}", s),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum StateError {
InvalidTransition { from: String, to: String },
MissingState(String),
Corrupted(String),
}
impl fmt::Display for StateError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
StateError::InvalidTransition { from, to } => {
write!(f, "Invalid state transition: {} -> {}", from, to)
}
StateError::MissingState(s) => write!(f, "Missing required state: {}", s),
StateError::Corrupted(s) => write!(f, "State corruption: {}", s),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum CapabilityError {
Denied { capability: String, reason: String },
InvalidFormat(String),
}
impl fmt::Display for CapabilityError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
CapabilityError::Denied { capability, reason } => {
write!(f, "Capability denied '{}' - {}", capability, reason)
}
CapabilityError::InvalidFormat(s) => write!(f, "Invalid capability format: {}", s),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum ToolError {
NotFound(String),
Timeout { tool: String, duration_ms: u64 },
ExecutionFailed { tool: String, reason: String },
InvalidInput { tool: String, reason: String },
SerializationFailed { tool: String, reason: String },
}
impl fmt::Display for ToolError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ToolError::NotFound(name) => write!(f, "Tool not found: {}", name),
ToolError::Timeout { tool, duration_ms } => {
write!(f, "Tool {} timed out after {}ms", tool, duration_ms)
}
ToolError::ExecutionFailed { tool, reason } => {
write!(f, "Tool {} execution failed: {}", tool, reason)
}
ToolError::InvalidInput { tool, reason } => {
write!(f, "Tool {} invalid input: {}", tool, reason)
}
ToolError::SerializationFailed { tool, reason } => {
write!(f, "Tool {} serialization failed: {}", tool, reason)
}
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum SerializationError {
Json(String),
Binary(String),
Deserialization(String),
NonDeterministic(String),
}
impl fmt::Display for SerializationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
SerializationError::Json(s) => write!(f, "JSON serialization failed: {}", s),
SerializationError::Binary(s) => write!(f, "Binary serialization failed: {}", s),
SerializationError::Deserialization(s) => write!(f, "Deserialization failed: {}", s),
SerializationError::NonDeterministic(s) => {
write!(f, "Non-deterministic serialization: {}", s)
}
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum ValidationError {
InvalidValue(String),
MissingField(String),
ConstraintViolation(String),
}
impl fmt::Display for ValidationError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ValidationError::InvalidValue(s) => write!(f, "Invalid value: {}", s),
ValidationError::MissingField(s) => write!(f, "Missing required field: {}", s),
ValidationError::ConstraintViolation(s) => write!(f, "Constraint violation: {}", s),
}
}
}
impl From<EventLogError> for Error {
fn from(e: EventLogError) -> Self {
Error::EventLog(e)
}
}
impl From<HashError> for Error {
fn from(e: HashError) -> Self {
Error::Hash(e)
}
}
impl From<StateError> for Error {
fn from(e: StateError) -> Self {
Error::State(e)
}
}
impl From<CapabilityError> for Error {
fn from(e: CapabilityError) -> Self {
Error::Capability(e)
}
}
impl From<ToolError> for Error {
fn from(e: ToolError) -> Self {
Error::Tool(e)
}
}
impl From<SerializationError> for Error {
fn from(e: SerializationError) -> Self {
Error::Serialization(e)
}
}
impl From<ValidationError> for Error {
fn from(e: ValidationError) -> Self {
Error::Validation(e)
}
}