1use std::fmt;
2
3#[derive(Debug, Clone, PartialEq)]
6pub enum Error {
7 Http(String),
9 Status { status: u16, message: String },
12 Decode(String),
14 DuplicateQuestion(String),
16 Invalid { id: String, why: String },
18 MissingAnswer(String),
20 WrongType { id: String, expected: &'static str, found: String },
22 MissingProbability { id: String, label: String },
25 BadAnswer { id: String, why: String },
28}
29
30pub type Result<T> = std::result::Result<T, Error>;
31
32impl fmt::Display for Error {
33 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34 match self {
35 Error::Http(message) => write!(f, "HTTP error: {message}"),
36 Error::Status { status, message } => write!(f, "decisions endpoint returned HTTP {status}: {message}"),
37 Error::Decode(message) => write!(f, "invalid message: {message}"),
38 Error::DuplicateQuestion(id) => write!(f, "question `{id}` is asked twice"),
39 Error::Invalid { id, why } => write!(f, "question `{id}`: {why}"),
40 Error::MissingAnswer(id) => write!(f, "no answer for question `{id}`"),
41 Error::WrongType { id, expected, found } => write!(f, "question `{id}` is a {found}, not a {expected}"),
42 Error::MissingProbability { id, label } => write!(f, "question `{id}` gives no probability for `{label}`"),
43 Error::BadAnswer { id, why } => write!(f, "the answer to question `{id}` can't be read: {why}"),
44 }
45 }
46}
47
48impl std::error::Error for Error {}