use std::io;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum ControllerError {
#[error("IO error: {0}")]
Io(#[from] io::Error),
#[error("Raft error: {0}")]
Raft(String),
#[error("Not leader, current leader is: {}", leader_id.map(|id| id.to_string()).unwrap_or_else(|| "unknown".to_string()))]
NotLeader { leader_id: Option<u64> },
#[error("Metadata not found: {key}")]
MetadataNotFound { key: String },
#[error("Invalid request: {0}")]
InvalidRequest(String),
#[error("Broker registration failed: {0}")]
BrokerRegistrationFailed(String),
#[error("Not initialized: {0}")]
NotInitialized(String),
#[error("Initialization failed")]
InitializationFailed,
#[error("Configuration error: {0}")]
ConfigError(String),
#[error("Serialization error: {0}")]
SerializationError(String),
#[error("Storage error: {0}")]
StorageError(String),
#[error("Network error: {0}")]
NetworkError(String),
#[error("Operation timeout after {timeout_ms}ms")]
Timeout { timeout_ms: u64 },
#[error("Internal error: {0}")]
Internal(String),
#[error("Controller is shutting down")]
Shutdown,
}
pub type ControllerResult<T> = std::result::Result<T, ControllerError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_controller_error() {
let err = ControllerError::Io(io::Error::other("test"));
assert_eq!(err.to_string(), "IO error: test");
let err = ControllerError::Raft("raft error".to_string());
assert_eq!(err.to_string(), "Raft error: raft error");
let err = ControllerError::NotLeader { leader_id: Some(1) };
assert_eq!(err.to_string(), "Not leader, current leader is: 1");
let err = ControllerError::NotLeader { leader_id: None };
assert_eq!(err.to_string(), "Not leader, current leader is: unknown");
let err = ControllerError::MetadataNotFound {
key: "broker-a".to_string(),
};
assert_eq!(err.to_string(), "Metadata not found: broker-a");
let err = ControllerError::InvalidRequest("bad request".to_string());
assert_eq!(err.to_string(), "Invalid request: bad request");
let err = ControllerError::BrokerRegistrationFailed("failed".to_string());
assert_eq!(err.to_string(), "Broker registration failed: failed");
let err = ControllerError::NotInitialized("init first".to_string());
assert_eq!(err.to_string(), "Not initialized: init first");
let err = ControllerError::InitializationFailed;
assert_eq!(err.to_string(), "Initialization failed");
let err = ControllerError::ConfigError("invalid config".to_string());
assert_eq!(err.to_string(), "Configuration error: invalid config");
let err = ControllerError::SerializationError("serde error".to_string());
assert_eq!(err.to_string(), "Serialization error: serde error");
let err = ControllerError::StorageError("disk full".to_string());
assert_eq!(err.to_string(), "Storage error: disk full");
let err = ControllerError::NetworkError("disconnected".to_string());
assert_eq!(err.to_string(), "Network error: disconnected");
let err = ControllerError::Timeout { timeout_ms: 5000 };
assert_eq!(err.to_string(), "Operation timeout after 5000ms");
let err = ControllerError::Internal("panic".to_string());
assert_eq!(err.to_string(), "Internal error: panic");
let err = ControllerError::Shutdown;
assert_eq!(err.to_string(), "Controller is shutting down");
}
}