notion/models/
error.rs

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/// <https://developers.notion.com/reference/errors>
24#[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/// <https://developers.notion.com/reference/errors>
32#[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)] // serde issue #912
48    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}