From 1c22088640e5deeadd61017bd90920b652685b5f Mon Sep 17 00:00:00 2001 From: Jake Swenson Date: Sun, 29 Aug 2021 12:59:04 -0700 Subject: Notion API Version 2021-08-16 support; fix a bunch of modling errors as well --- src/models/error.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/models/error.rs (limited to 'src/models/error.rs') diff --git a/src/models/error.rs b/src/models/error.rs new file mode 100644 index 0000000..e382719 --- /dev/null +++ b/src/models/error.rs @@ -0,0 +1,70 @@ +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)] // serde issue #912 + 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) + } +} -- cgit v1.2.3