use thiserror::Error;
pub type Result<T> = std::result::Result<T, MatchingError>;
#[derive(Error, Debug)]
pub enum MatchingError {
#[error("Invalid patient data: {0}")]
InvalidData(String),
#[error("Missing required field: {0}")]
MissingField(String),
#[error("Invalid NHS number: {0}")]
InvalidNhsNumber(String),
#[error("Invalid date format: {0}")]
InvalidDate(String),
#[error("Configuration error: {0}")]
ConfigError(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn missing_field_display() {
let e = MatchingError::MissingField("nhs_number".into());
assert_eq!(e.to_string(), "Missing required field: nhs_number");
}
#[test]
fn invalid_data_display() {
let e = MatchingError::InvalidData("oops".into());
assert_eq!(e.to_string(), "Invalid patient data: oops");
}
#[test]
fn invalid_nhs_display() {
let e = MatchingError::InvalidNhsNumber("ABCDEFGHIJ".into());
assert!(e.to_string().contains("Invalid NHS number"));
}
#[test]
fn invalid_date_display() {
let e = MatchingError::InvalidDate("2024-13-32".into());
assert!(e.to_string().contains("Invalid date format"));
}
#[test]
fn config_error_display() {
let e = MatchingError::ConfigError("threshold > 1.0".into());
assert!(e.to_string().contains("Configuration error"));
}
#[test]
fn result_alias_resolves() {
fn make() -> Result<i32> {
Ok(42)
}
assert_eq!(make().unwrap(), 42);
}
#[test]
fn errors_are_send_and_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<MatchingError>();
}
}