1use std::fmt;
4
5pub type Result<T> = std::result::Result<T, Error>;
7
8#[derive(Copy, Clone, Debug, Eq, PartialEq)]
10pub enum ErrorKind {
11 MissingHeaderParam,
13
14 InvalidHeaderParam,
16
17 UnsupportedMacAlgorithm,
19
20 InvalidMessage,
22
23 InvalidSignature,
25
26 Other,
28}
29
30#[derive(Clone, Debug)]
38pub struct Error{
39 pub kind: ErrorKind,
40 pub message: String,
41}
42
43impl ErrorKind {
44 fn with_message(self, message: impl Into<String>) -> Error {
45 Error{kind: self, message: message.into()}
46 }
47}
48
49impl Error {
50 #![allow(non_upper_case_globals)]
51
52 pub const Other : ErrorKind = ErrorKind::Other;
53 pub const MissingHeaderParam : ErrorKind = ErrorKind::MissingHeaderParam;
54 pub const InvalidHeaderParam : ErrorKind = ErrorKind::InvalidHeaderParam;
55 pub const UnsupportedMacAlgorithm : ErrorKind = ErrorKind::UnsupportedMacAlgorithm;
56 pub const InvalidMessage : ErrorKind = ErrorKind::InvalidMessage;
57 pub const InvalidSignature : ErrorKind = ErrorKind::InvalidSignature;
58
59 pub fn kind(&self) -> ErrorKind {
61 self.kind
62 }
63
64 pub fn message(&self) -> &str {
66 &self.message
67 }
68
69 pub fn other(message: impl Into<String>) -> Self {
71 ErrorKind::Other.with_message(message)
72 }
73
74 pub fn missing_header_param(message: impl Into<String>) -> Self {
76 ErrorKind::MissingHeaderParam.with_message(message)
77 }
78
79 pub fn invalid_header_param(message: impl Into<String>) -> Self {
81 ErrorKind::InvalidHeaderParam.with_message(message)
82 }
83
84 pub fn unsupported_mac_algorithm(message: impl Into<String>) -> Self {
86 ErrorKind::UnsupportedMacAlgorithm.with_message(message)
87 }
88
89 pub fn invalid_message(message: impl Into<String>) -> Self {
91 ErrorKind::InvalidMessage.with_message(message)
92 }
93
94 pub fn invalid_signature(message: impl Into<String>) -> Self {
96 ErrorKind::InvalidSignature.with_message(message)
97 }
98}
99
100
101impl fmt::Display for ErrorKind {
102 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
103 match self {
104 ErrorKind::Other => write!(formatter, "unspecified error"),
105 ErrorKind::MissingHeaderParam => write!(formatter, "missing header parameter"),
106 ErrorKind::InvalidHeaderParam => write!(formatter, "invalid header parameter"),
107 ErrorKind::UnsupportedMacAlgorithm => write!(formatter, "unsupported MAC algorithm"),
108 ErrorKind::InvalidMessage => write!(formatter, "invalid message"),
109 ErrorKind::InvalidSignature => write!(formatter, "invalid signature"),
110 }
111 }
112}
113
114impl fmt::Display for Error {
115 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
116 if self.message.is_empty() {
117 write!(formatter, "{}", self.kind)
118 } else {
119 write!(formatter, "{}: {}", self.kind, self.message)
120 }
121 }
122}
123
124impl std::error::Error for Error {}