eagle_api/
api.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use crate::{Error, Result};
5
6pub mod application;
7pub mod folder;
8pub mod item;
9pub mod library;
10
11#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
12#[serde(rename_all = "camelCase")]
13pub enum EagleApiStatus {
14    Success,
15    Error,
16}
17
18#[derive(Debug, Serialize, Deserialize)]
19#[serde(untagged)]
20pub(crate) enum EagleApiData<T> {
21    Message(String),
22    Data(T),
23    Any(Value),
24}
25
26impl<T> EagleApiData<T> {
27    pub(crate) fn into_message(self) -> Option<String> {
28        match self {
29            EagleApiData::Message(message) => Some(message),
30            EagleApiData::Any(value) => serde_json::to_string(&value).ok(),
31            _ => None,
32        }
33    }
34
35    pub(crate) fn into_data(self) -> Option<T> {
36        match self {
37            EagleApiData::Data(data) => Some(data),
38            _ => None,
39        }
40    }
41}
42
43#[derive(Debug, Serialize, Deserialize)]
44#[serde(untagged)]
45pub enum EagleApiCode {
46    String(String),
47    Number(i64),
48}
49
50#[derive(Debug, Serialize, Deserialize)]
51#[serde(rename_all = "camelCase")]
52pub(crate) struct EagleResponse<T> {
53    status: EagleApiStatus,
54    data: Option<EagleApiData<T>>,
55    code: Option<EagleApiCode>,
56    message: Option<String>,
57}
58
59impl<T> EagleResponse<T> {
60    pub(crate) fn ok(self) -> Result<T> {
61        match self.status {
62            EagleApiStatus::Success => match self.data.and_then(|data| data.into_data()) {
63                Some(data) => Ok(data),
64                None => Err(Error::MissingData),
65            },
66            _ => Err(Error::EagleApi {
67                status: self.status,
68                data: self.data.and_then(|data| data.into_message()),
69                code: self.code,
70                message: self.message,
71            }),
72        }
73    }
74
75    pub(crate) fn ok_without_data(self) -> Result<()> {
76        match self.status {
77            EagleApiStatus::Success => Ok(()),
78            _ => Err(Error::EagleApi {
79                status: self.status,
80                data: self.data.and_then(|data| data.into_message()),
81                code: self.code,
82                message: self.message,
83            }),
84        }
85    }
86
87    pub(crate) fn ok_str(self) -> Result<String> {
88        match self.status {
89            EagleApiStatus::Success => match self.data.and_then(|data| data.into_message()) {
90                Some(data) => Ok(data),
91                None => Err(Error::MissingData),
92            },
93            _ => Err(Error::EagleApi {
94                status: self.status,
95                data: self.data.and_then(|data| data.into_message()),
96                code: self.code,
97                message: self.message,
98            }),
99        }
100    }
101}