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}