box_open_sdk/models/schemas/
app_item_associations.rs1use crate::serde_helpers::double_option;
4
5use super::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub enum AppItemAssociatedItem {
9 File(FileBase),
10 Folder(FolderBase),
11 WebLink(WebLinkBase),
12 Unknown(serde_json::Value),
14}
15
16impl Default for AppItemAssociatedItem {
17 fn default() -> Self {
18 Self::Unknown(Default::default())
19 }
20}
21
22impl serde::Serialize for AppItemAssociatedItem {
23 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
24 match self {
25 Self::File(inner) => inner.serialize(serializer),
26 Self::Folder(inner) => inner.serialize(serializer),
27 Self::WebLink(inner) => inner.serialize(serializer),
28 Self::Unknown(inner) => inner.serialize(serializer),
29 }
30 }
31}
32
33impl<'de> serde::Deserialize<'de> for AppItemAssociatedItem {
34 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
35 let value = serde_json::Value::deserialize(deserializer)?;
36 let tag = value
37 .get("type")
38 .and_then(serde_json::Value::as_str)
39 .map(str::to_owned);
40 match tag.as_deref() {
41 Some("file") => Ok(Self::File(
42 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
43 )),
44 Some("folder") => Ok(Self::Folder(
45 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
46 )),
47 Some("web_link") => Ok(Self::WebLink(
48 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
49 )),
50 _ => Ok(Self::Unknown(value)),
51 }
52 }
53}
54
55#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
56pub struct AppItemAssociation {
57 pub id: String,
58 pub r#type: AppItemAssociationType,
59 pub app_item: AppItem,
60 pub item: AppItemAssociatedItem,
61}
62
63#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
64pub struct AppItemAssociations {
65 #[serde(default, skip_serializing_if = "Option::is_none")]
66 pub limit: Option<i64>,
67 #[serde(
68 default,
69 skip_serializing_if = "Option::is_none",
70 deserialize_with = "double_option"
71 )]
72 pub next_marker: Option<Option<String>>,
73 #[serde(
74 default,
75 skip_serializing_if = "Option::is_none",
76 deserialize_with = "double_option"
77 )]
78 pub prev_marker: Option<Option<String>>,
79 #[serde(default, skip_serializing_if = "Option::is_none")]
80 pub entries: Option<Vec<AppItemAssociation>>,
81}
82
83#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
84pub struct FolderBase {
85 pub id: String,
86 #[serde(
87 default,
88 skip_serializing_if = "Option::is_none",
89 deserialize_with = "double_option"
90 )]
91 pub etag: Option<Option<String>>,
92 pub r#type: FolderType,
93}
94
95#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
96pub struct WebLinkBase {
97 pub id: String,
98 pub r#type: TrashWebLinkType,
99 #[serde(default, skip_serializing_if = "Option::is_none")]
100 pub etag: Option<String>,
101}
102
103#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
104#[serde(transparent)]
105pub struct AppItemAssociationType(pub String);
106
107impl AppItemAssociationType {
108 pub const APP_ITEM_ASSOCIATION: &'static str = "app_item_association";
109}