use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Error {
EmptyInput,
InvalidInput(String),
DegenerateInput(String),
InsufficientData,
NotConverged,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::EmptyInput => write!(f, "input was empty"),
Self::InvalidInput(m) => write!(f, "invalid input: {m}"),
Self::DegenerateInput(m) => write!(f, "degenerate input: {m}"),
Self::InsufficientData => write!(f, "insufficient data"),
Self::NotConverged => write!(f, "did not converge"),
}
}
}
impl std::error::Error for Error {}
pub type Result<T> = std::result::Result<T, Error>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_is_human_readable() {
assert_eq!(
Error::EmptyInput.to_string(),
"input was empty",
"EmptyInput display text changed"
);
}
#[test]
fn display_includes_detail_for_message_variants() {
assert_eq!(
Error::InvalidInput("scale must be > 0".to_owned()).to_string(),
"invalid input: scale must be > 0"
);
assert_eq!(
Error::DegenerateInput("zero variance".to_owned()).to_string(),
"degenerate input: zero variance"
);
}
#[test]
fn usable_as_std_error() {
fn boxed() -> Box<dyn std::error::Error> {
Box::new(Error::NotConverged)
}
assert_eq!(boxed().to_string(), "did not converge");
}
}