box_open_sdk/models/schemas/
hub_items.rs1use crate::serde_helpers::double_option;
4
5use super::*;
6
7#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
8pub struct HubItem {
9 pub id: String,
10 pub r#type: HubItemType,
11 pub name: String,
12}
13
14#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
15pub struct HubItemOperation {
16 pub action: HubItemOperationAction,
17 pub item: HubItemReference,
18 #[serde(default, skip_serializing_if = "Option::is_none")]
19 pub parent_id: Option<String>,
20}
21
22#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
23pub struct HubItemOperationResult {
24 #[serde(default, skip_serializing_if = "Option::is_none")]
25 pub action: Option<String>,
26 #[serde(default, skip_serializing_if = "Option::is_none")]
27 pub item: Option<HubItemReference>,
28 #[serde(default, skip_serializing_if = "Option::is_none")]
29 pub parent_id: Option<String>,
30 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub status: Option<i64>,
32 #[serde(default, skip_serializing_if = "Option::is_none")]
33 pub error: Option<String>,
34}
35
36#[derive(Clone, Debug, PartialEq)]
37pub enum HubItemReference {
38 File(FileReference),
39 Folder(FolderReference),
40 WebLink(WeblinkReference),
41 Unknown(serde_json::Value),
43}
44
45impl Default for HubItemReference {
46 fn default() -> Self {
47 Self::Unknown(Default::default())
48 }
49}
50
51impl serde::Serialize for HubItemReference {
52 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
53 match self {
54 Self::File(inner) => inner.serialize(serializer),
55 Self::Folder(inner) => inner.serialize(serializer),
56 Self::WebLink(inner) => inner.serialize(serializer),
57 Self::Unknown(inner) => inner.serialize(serializer),
58 }
59 }
60}
61
62impl<'de> serde::Deserialize<'de> for HubItemReference {
63 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
64 let value = serde_json::Value::deserialize(deserializer)?;
65 let tag = value
66 .get("type")
67 .and_then(serde_json::Value::as_str)
68 .map(str::to_owned);
69 match tag.as_deref() {
70 Some("file") => Ok(Self::File(
71 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
72 )),
73 Some("folder") => Ok(Self::Folder(
74 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
75 )),
76 Some("web_link") => Ok(Self::WebLink(
77 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
78 )),
79 _ => Ok(Self::Unknown(value)),
80 }
81 }
82}
83
84#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
85pub struct HubItems {
86 #[serde(default, skip_serializing_if = "Option::is_none")]
87 pub entries: Option<Vec<HubItem>>,
88 #[serde(default, skip_serializing_if = "Option::is_none")]
89 pub limit: Option<i64>,
90 #[serde(
91 default,
92 skip_serializing_if = "Option::is_none",
93 deserialize_with = "double_option"
94 )]
95 pub next_marker: Option<Option<String>>,
96}
97
98#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
99pub struct HubItemsManageRequest {
100 #[serde(default, skip_serializing_if = "Option::is_none")]
101 pub operations: Option<Vec<HubItemOperation>>,
102}
103
104#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
105pub struct HubItemsManageResponse {
106 pub operations: Vec<HubItemOperationResult>,
107}
108
109#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
110pub struct WeblinkReference {
111 pub r#type: WeblinkReferenceType,
112 pub id: String,
113}
114
115#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
116#[serde(transparent)]
117pub struct HubItemType(pub String);
118
119impl HubItemType {
120 pub const FILE: &'static str = "file";
121 pub const FOLDER: &'static str = "folder";
122 pub const WEB_LINK: &'static str = "web_link";
123}
124
125#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
126#[serde(transparent)]
127pub struct HubItemOperationAction(pub String);
128
129impl HubItemOperationAction {
130 pub const ADD: &'static str = "add";
131 pub const REMOVE: &'static str = "remove";
132}
133
134#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
135#[serde(transparent)]
136pub struct WeblinkReferenceType(pub String);
137
138impl WeblinkReferenceType {
139 pub const WEB_LINK: &'static str = "web_link";
140}