mtotp_lib/
error.rs

1use std::fmt::{Display, Formatter};
2use hmac::digest::InvalidLength;
3
4#[derive(Debug)]
5pub enum Error {
6    Hmac(InvalidLength),
7    Message(ErrorMessage),
8    Other(Box<dyn std::error::Error + Sync + Send>),
9}
10
11impl Error {
12    pub(crate) fn message(content: impl Into<String>) -> Self {
13        Self::Message(ErrorMessage {
14            content: content.into(),
15        })
16    }
17}
18
19impl Display for Error {
20    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
21        let mut builder = f.debug_struct("apple_development::Error");
22        match self {
23            Error::Hmac(err) => {
24                builder.field("kind", &"Hmac");
25                builder.field("source", err);
26            }
27            Error::Message(err) => {
28                builder.field("kind", &"Message");
29                builder.field("source", err);
30            }
31            Error::Other(err) => {
32                builder.field("kind", &"Other");
33                builder.field("source", err);
34            }
35        }
36        builder.finish()
37    }
38}
39
40impl std::error::Error for Error {}
41
42pub type Result<A> = std::result::Result<A, Error>;
43
44#[derive(Default, Debug, Clone)]
45pub struct ErrorMessage {
46    pub content: String,
47}
48
49impl Display for ErrorMessage {
50    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
51        let mut builder = f.debug_struct("apple_development::ErrorMessage");
52        builder.field("content", &self.content);
53        builder.finish()
54    }
55}
56
57impl std::error::Error for ErrorMessage {}
58
59impl From<InvalidLength> for Error {
60    fn from(value: InvalidLength) -> Self {
61        Self::Hmac(value)
62    }
63}
64
65impl From<std::io::Error> for Error {
66    fn from(value: std::io::Error) -> Self {
67        Self::Other(Box::new(value))
68    }
69}