autumn_plugin_discord/
error.rs1use autumn_web::AutumnError;
8use thiserror::Error;
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12#[non_exhaustive]
13pub enum ErrorKind {
14 Config,
16 Signature,
18 Json,
20 Http,
22 DiscordApi,
24 Gateway,
26 UnknownCommand,
28 MissingRuntime,
30}
31
32#[derive(Debug, Error)]
34#[non_exhaustive]
35pub enum Error {
36 #[error("discord config error: {0}")]
38 Config(String),
39
40 #[error("discord signature error: {0}")]
42 Signature(String),
43
44 #[error("discord json error: {0}")]
46 Json(#[from] serde_json::Error),
47
48 #[error("discord http error: {0}")]
50 Http(#[from] reqwest::Error),
51
52 #[error("discord api error: status {status}: {body}")]
54 DiscordApi {
55 status: u16,
57 body: String,
59 },
60
61 #[error("discord gateway error: {0}")]
63 Gateway(String),
64
65 #[error("unknown discord command: {0}")]
67 UnknownCommand(String),
68
69 #[error("discord runtime not installed")]
71 MissingRuntime,
72}
73
74impl Error {
75 #[must_use]
77 pub const fn kind(&self) -> ErrorKind {
78 match self {
79 Self::Config(_) => ErrorKind::Config,
80 Self::Signature(_) => ErrorKind::Signature,
81 Self::Json(_) => ErrorKind::Json,
82 Self::Http(_) => ErrorKind::Http,
83 Self::DiscordApi { .. } => ErrorKind::DiscordApi,
84 Self::Gateway(_) => ErrorKind::Gateway,
85 Self::UnknownCommand(_) => ErrorKind::UnknownCommand,
86 Self::MissingRuntime => ErrorKind::MissingRuntime,
87 }
88 }
89
90 #[must_use]
92 pub const fn status_code(&self) -> u16 {
93 match self.kind() {
94 ErrorKind::Config | ErrorKind::Http | ErrorKind::DiscordApi | ErrorKind::Gateway => 500,
97 ErrorKind::Signature => 401,
98 ErrorKind::Json | ErrorKind::UnknownCommand => 400,
99 ErrorKind::MissingRuntime => 503,
100 }
101 }
102
103 #[must_use]
108 pub fn to_autumn_error(&self) -> AutumnError {
109 let message = self.to_string();
110 match self.kind() {
111 ErrorKind::Signature => AutumnError::unauthorized_msg(message),
112 ErrorKind::Json | ErrorKind::UnknownCommand => AutumnError::bad_request_msg(message),
113 ErrorKind::MissingRuntime => AutumnError::service_unavailable_msg(message),
114 ErrorKind::Config | ErrorKind::Http | ErrorKind::DiscordApi | ErrorKind::Gateway => {
115 AutumnError::internal_server_error_msg(message)
116 }
117 }
118 }
119}
120
121pub type Result<T> = std::result::Result<T, Error>;
123
124#[cfg(test)]
125mod tests;