use thiserror::Error;
#[non_exhaustive]
#[derive(Debug, Error)]
pub enum EntryError {
#[error("Entry validation failed: {reason}")]
ValidationFailed {
reason: String,
},
#[error("Entry serialization failed: {context}")]
SerializationFailed {
context: String,
},
#[error("Invalid entry structure: {reason}")]
InvalidStructure {
reason: String,
},
}
impl EntryError {
pub fn is_validation_error(&self) -> bool {
matches!(
self,
EntryError::ValidationFailed { .. } | EntryError::InvalidStructure { .. }
)
}
pub fn is_serialization_error(&self) -> bool {
matches!(self, EntryError::SerializationFailed { .. })
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::entry::id::IdError;
#[test]
fn test_id_error_direct_conversion() {
let id_err = IdError::InvalidFormat("not hex".to_string());
let main_err: crate::Error = id_err.into();
assert!(main_err.is_id_error());
assert!(main_err.is_validation_error());
assert_eq!(main_err.module(), "id");
}
#[test]
fn test_unknown_algorithm_error() {
let id_err = IdError::UnknownAlgorithm("md5".to_string());
let main_err: crate::Error = id_err.into();
assert!(main_err.is_id_error());
assert!(main_err.is_validation_error());
assert_eq!(main_err.module(), "id");
}
#[test]
fn test_length_error() {
let id_err = IdError::InvalidLength {
expected: 64,
got: 32,
};
let main_err: crate::Error = id_err.into();
assert!(main_err.is_id_error());
assert!(main_err.is_validation_error());
assert_eq!(main_err.module(), "id");
}
#[test]
fn test_error_helpers() {
let err = EntryError::ValidationFailed {
reason: "test".to_string(),
};
assert!(err.is_validation_error());
assert!(!err.is_serialization_error());
let err = EntryError::SerializationFailed {
context: "test".to_string(),
};
assert!(!err.is_validation_error());
assert!(err.is_serialization_error());
let err = EntryError::InvalidStructure {
reason: "test".to_string(),
};
assert!(err.is_validation_error());
assert!(!err.is_serialization_error());
}
#[test]
fn test_error_conversion_to_main() {
let entry_err = EntryError::ValidationFailed {
reason: "test".to_string(),
};
let main_err: crate::Error = entry_err.into();
assert!(main_err.is_entry_error());
assert!(!main_err.is_id_error());
assert!(main_err.is_validation_error());
}
#[test]
fn test_id_error_integration() {
use crate::entry::id::IdError;
let id_err = IdError::InvalidLength {
expected: 64,
got: 32,
};
let main_err: crate::Error = id_err.into();
assert!(!main_err.is_entry_error());
assert!(main_err.is_id_error());
assert!(main_err.is_validation_error());
assert_eq!(main_err.module(), "id");
let id_err = IdError::UnknownAlgorithm("md5".to_string());
let main_err: crate::Error = id_err.into();
assert!(!main_err.is_entry_error());
assert!(main_err.is_id_error());
assert!(main_err.is_validation_error());
let error_string = main_err.to_string();
assert!(error_string.contains("md5"));
}
#[test]
fn test_error_categorization_comprehensive() {
let id_errors = vec![
IdError::InvalidFormat("not hex".to_string()),
IdError::InvalidLength {
expected: 64,
got: 32,
},
IdError::UnknownAlgorithm("sha1".to_string()),
IdError::InvalidHex("contains G".to_string()),
];
for id_err in id_errors {
let main_err: crate::Error = id_err.into();
assert!(main_err.is_id_error());
assert!(main_err.is_validation_error());
assert!(!main_err.is_entry_error());
assert!(!main_err.is_entry_serialization_error());
assert!(!main_err.is_io_error());
assert_eq!(main_err.module(), "id");
}
let validation_err = EntryError::ValidationFailed {
reason: "test".to_string(),
};
let main_err: crate::Error = validation_err.into();
assert!(main_err.is_validation_error());
assert!(main_err.is_entry_error());
assert!(!main_err.is_id_error());
let serialization_err = EntryError::SerializationFailed {
context: "test".to_string(),
};
let main_err: crate::Error = serialization_err.into();
assert!(main_err.is_entry_serialization_error());
assert!(main_err.is_entry_error());
assert!(!main_err.is_validation_error());
assert!(!main_err.is_id_error());
}
}