use std::io;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum StorageError {
#[error("database error: {0}")]
Database(#[from] lbug::Error),
#[error("io error: {0}")]
Io(#[from] io::Error),
#[error("csv error: {0}")]
Csv(#[from] csv::Error),
#[error("json error: {0}")]
Json(#[from] serde_json::Error),
#[error("query failed: {0}")]
Query(String),
#[error("schema error: {0}")]
Schema(String),
#[error("not found: {0}")]
NotFound(String),
#[error("invalid data: {0}")]
InvalidData(String),
#[error("database corrupt: {0}")]
Corrupt(String),
}
pub type Result<T> = std::result::Result<T, StorageError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn database_variant_displays_message() {
let err = StorageError::Query("bad cypher".to_string());
assert_eq!(err.to_string(), "query failed: bad cypher");
}
#[test]
fn schema_variant_displays_message() {
let err = StorageError::Schema("unsupported index".to_string());
assert_eq!(err.to_string(), "schema error: unsupported index");
}
#[test]
fn not_found_variant_displays_message() {
let err = StorageError::NotFound("project foo".to_string());
assert_eq!(err.to_string(), "not found: project foo");
}
#[test]
fn invalid_data_variant_displays_message() {
let err = StorageError::InvalidData("missing id".to_string());
assert_eq!(err.to_string(), "invalid data: missing id");
}
#[test]
fn io_error_converts_via_from() {
let io_err = io::Error::new(io::ErrorKind::NotFound, "missing file");
let storage_err: StorageError = io_err.into();
assert!(storage_err.to_string().contains("io error"));
assert!(storage_err.to_string().contains("missing file"));
}
#[test]
fn csv_error_converts_via_from() {
let io_err = io::Error::other("csv failure");
let csv_err: csv::Error = io_err.into();
let storage_err: StorageError = csv_err.into();
assert!(storage_err.to_string().contains("csv error"));
}
#[test]
fn json_error_converts_via_from() {
let json_err = serde_json::from_str::<serde_json::Value>("bad").unwrap_err();
let storage_err: StorageError = json_err.into();
assert!(storage_err.to_string().contains("json error"));
}
#[test]
fn debug_includes_variant_name() {
let err = StorageError::NotFound("x".to_string());
let s = format!("{err:?}");
assert!(s.contains("NotFound"));
assert!(s.contains("\"x\""));
}
}