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}