1use serde::{Deserialize, Serialize};
2use std::fmt::{Display, Formatter};
3
4#[derive(Serialize, Deserialize, Eq, PartialEq, Ord, PartialOrd, Debug, Clone, Hash)]
5#[serde(transparent)]
6pub struct StatusCode(u16);
7
8impl StatusCode {
9 pub fn code(&self) -> u16 {
10 self.0
11 }
12}
13
14impl Display for StatusCode {
15 fn fmt(
16 &self,
17 f: &mut Formatter<'_>,
18 ) -> std::fmt::Result {
19 self.0.fmt(f)
20 }
21}
22
23#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)]
25pub struct ErrorResponse {
26 pub status: StatusCode,
27 pub code: ErrorCode,
28 pub message: String,
29}
30
31#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)]
33#[serde(rename_all = "snake_case")]
34pub enum ErrorCode {
35 InvalidJson,
36 InvalidRequestUrl,
37 InvalidRequest,
38 ValidationError,
39 MissionVersion,
40 Unauthorized,
41 RestrictedResource,
42 ObjectNotFound,
43 ConflictError,
44 RateLimited,
45 InternalServerError,
46 ServiceUnavailable,
47 #[serde(other)] Unknown,
49}
50
51impl Display for ErrorCode {
52 fn fmt(
53 &self,
54 f: &mut Formatter<'_>,
55 ) -> std::fmt::Result {
56 write!(f, "{:?}", self)
57 }
58}
59
60#[cfg(test)]
61mod tests {
62 use crate::models::error::{ErrorCode, ErrorResponse};
63
64 #[test]
65 fn deserialize_error() {
66 let error: ErrorResponse = serde_json::from_str(include_str!("tests/error.json")).unwrap();
67 assert_eq!(error.code, ErrorCode::ValidationError)
68 }
69
70 #[test]
71 fn deserialize_unknown_error() {
72 let error: ErrorResponse =
73 serde_json::from_str(include_str!("tests/unknown_error.json")).unwrap();
74 assert_eq!(error.code, ErrorCode::Unknown)
75 }
76}