use std::time::Duration;
#[derive(Debug, thiserror::Error)]
pub enum CassandraError {
#[error("Connection error: {0}")]
Connection(String),
#[error("Authentication failed: {0}")]
Authentication(String),
#[error("Query execution failed: {0}")]
Query(String),
#[error("Row deserialization failed: {0}")]
Deserialization(String),
#[error("Timeout after {duration:?}: {operation}")]
Timeout {
operation: String,
duration: Duration,
},
#[error("Configuration error: {0}")]
Config(String),
#[error("TLS error: {0}")]
Tls(String),
#[error("Lightweight transaction not applied")]
LwtNotApplied,
}
pub type CassandraResult<T> = Result<T, CassandraError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_connection_error_display() {
let err = CassandraError::Connection("refused".into());
assert_eq!(err.to_string(), "Connection error: refused");
}
#[test]
fn test_timeout_error_display() {
let err = CassandraError::Timeout {
operation: "query".into(),
duration: Duration::from_secs(5),
};
assert!(err.to_string().contains("query"));
assert!(err.to_string().contains("5s"));
}
#[test]
fn test_lwt_not_applied_is_no_data() {
let err = CassandraError::LwtNotApplied;
assert_eq!(err.to_string(), "Lightweight transaction not applied");
}
}