use serde::{Deserialize, Serialize};
use std::fmt::{Display, Formatter};
#[derive(Serialize, Deserialize, Eq, PartialEq, Ord, PartialOrd, Debug, Clone, Hash)]
#[serde(transparent)]
pub struct StatusCode(u16);
impl StatusCode {
pub fn code(&self) -> u16 {
self.0
}
}
impl Display for StatusCode {
fn fmt(
&self,
f: &mut Formatter<'_>,
) -> std::fmt::Result {
self.0.fmt(f)
}
}
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)]
pub struct ErrorResponse {
pub status: StatusCode,
pub code: ErrorCode,
pub message: String,
}
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)]
#[serde(rename_all = "snake_case")]
pub enum ErrorCode {
InvalidJson,
InvalidRequestUrl,
InvalidRequest,
ValidationError,
MissionVersion,
Unauthorized,
RestrictedResource,
ObjectNotFound,
ConflictError,
RateLimited,
InternalServerError,
ServiceUnavailable,
#[serde(other)] Unknown,
}
impl Display for ErrorCode {
fn fmt(
&self,
f: &mut Formatter<'_>,
) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
#[cfg(test)]
mod tests {
use crate::models::error::{ErrorCode, ErrorResponse};
#[test]
fn deserialize_error() {
let error: ErrorResponse = serde_json::from_str(include_str!("tests/error.json")).unwrap();
assert_eq!(error.code, ErrorCode::ValidationError)
}
#[test]
fn deserialize_unknown_error() {
let error: ErrorResponse =
serde_json::from_str(include_str!("tests/unknown_error.json")).unwrap();
assert_eq!(error.code, ErrorCode::Unknown)
}
}