box_open_sdk/models/schemas/
hub_document.rs1use crate::serde_helpers::double_option;
4
5#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
6pub struct HubCalloutBoxTextBlock {
7 pub id: String,
8 #[serde(
9 default,
10 skip_serializing_if = "Option::is_none",
11 deserialize_with = "double_option"
12 )]
13 pub parent_id: Option<Option<String>>,
14 pub r#type: HubCalloutBoxTextBlockType,
15 pub fragment: String,
16}
17
18#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
19pub struct HubDividerBlock {
20 pub id: String,
21 #[serde(
22 default,
23 skip_serializing_if = "Option::is_none",
24 deserialize_with = "double_option"
25 )]
26 pub parent_id: Option<Option<String>>,
27 pub r#type: HubDividerBlockType,
28}
29
30#[derive(Clone, Debug, PartialEq)]
31pub enum HubDocumentBlockEntry {
32 Paragraph(HubParagraphTextBlock),
33 SectionTitle(HubSectionTitleTextBlock),
34 CalloutBox(HubCalloutBoxTextBlock),
35 ItemList(HubItemListBlock),
36 Divider(HubDividerBlock),
37 Unknown(serde_json::Value),
39}
40
41impl Default for HubDocumentBlockEntry {
42 fn default() -> Self {
43 Self::Unknown(Default::default())
44 }
45}
46
47impl serde::Serialize for HubDocumentBlockEntry {
48 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
49 match self {
50 Self::Paragraph(inner) => inner.serialize(serializer),
51 Self::SectionTitle(inner) => inner.serialize(serializer),
52 Self::CalloutBox(inner) => inner.serialize(serializer),
53 Self::ItemList(inner) => inner.serialize(serializer),
54 Self::Divider(inner) => inner.serialize(serializer),
55 Self::Unknown(inner) => inner.serialize(serializer),
56 }
57 }
58}
59
60impl<'de> serde::Deserialize<'de> for HubDocumentBlockEntry {
61 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
62 let value = serde_json::Value::deserialize(deserializer)?;
63 let tag = value
64 .get("type")
65 .and_then(serde_json::Value::as_str)
66 .map(str::to_owned);
67 match tag.as_deref() {
68 Some("paragraph") => Ok(Self::Paragraph(
69 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
70 )),
71 Some("section_title") => Ok(Self::SectionTitle(
72 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
73 )),
74 Some("callout_box") => Ok(Self::CalloutBox(
75 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
76 )),
77 Some("item_list") => Ok(Self::ItemList(
78 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
79 )),
80 Some("divider") => Ok(Self::Divider(
81 serde_json::from_value(value).map_err(serde::de::Error::custom)?,
82 )),
83 _ => Ok(Self::Unknown(value)),
84 }
85 }
86}
87
88#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
89pub struct HubDocumentBlocks {
90 pub entries: Vec<HubDocumentBlockEntry>,
91 pub r#type: HubDocumentBlocksType,
92 #[serde(default, skip_serializing_if = "Option::is_none")]
93 pub limit: Option<i64>,
94 #[serde(
95 default,
96 skip_serializing_if = "Option::is_none",
97 deserialize_with = "double_option"
98 )]
99 pub next_marker: Option<Option<String>>,
100}
101
102#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
103pub struct HubDocumentPage {
104 pub id: String,
105 pub r#type: String,
106 #[serde(
107 default,
108 skip_serializing_if = "Option::is_none",
109 deserialize_with = "double_option"
110 )]
111 pub parent_id: Option<Option<String>>,
112 pub title_fragment: String,
113}
114
115#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
116pub struct HubDocumentPages {
117 pub entries: Vec<HubDocumentPage>,
118 pub r#type: HubDocumentPagesType,
119 #[serde(default, skip_serializing_if = "Option::is_none")]
120 pub limit: Option<i64>,
121 #[serde(
122 default,
123 skip_serializing_if = "Option::is_none",
124 deserialize_with = "double_option"
125 )]
126 pub next_marker: Option<Option<String>>,
127}
128
129#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
130pub struct HubItemListBlock {
131 pub id: String,
132 #[serde(
133 default,
134 skip_serializing_if = "Option::is_none",
135 deserialize_with = "double_option"
136 )]
137 pub parent_id: Option<Option<String>>,
138 pub r#type: HubItemListBlockType,
139}
140
141#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
142pub struct HubParagraphTextBlock {
143 pub id: String,
144 #[serde(
145 default,
146 skip_serializing_if = "Option::is_none",
147 deserialize_with = "double_option"
148 )]
149 pub parent_id: Option<Option<String>>,
150 pub r#type: HubParagraphTextBlockType,
151 pub fragment: String,
152}
153
154#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
155pub struct HubSectionTitleTextBlock {
156 pub id: String,
157 #[serde(
158 default,
159 skip_serializing_if = "Option::is_none",
160 deserialize_with = "double_option"
161 )]
162 pub parent_id: Option<Option<String>>,
163 pub r#type: HubSectionTitleTextBlockType,
164 pub fragment: String,
165}
166
167#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
168#[serde(transparent)]
169pub struct HubCalloutBoxTextBlockType(pub String);
170
171impl HubCalloutBoxTextBlockType {
172 pub const CALLOUT_BOX: &'static str = "callout_box";
173}
174
175#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
176#[serde(transparent)]
177pub struct HubDividerBlockType(pub String);
178
179impl HubDividerBlockType {
180 pub const DIVIDER: &'static str = "divider";
181}
182
183#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
184#[serde(transparent)]
185pub struct HubDocumentBlocksType(pub String);
186
187impl HubDocumentBlocksType {
188 pub const DOCUMENT_BLOCKS: &'static str = "document_blocks";
189}
190
191#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
192#[serde(transparent)]
193pub struct HubDocumentPagesType(pub String);
194
195impl HubDocumentPagesType {
196 pub const DOCUMENT_PAGES: &'static str = "document_pages";
197}
198
199#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
200#[serde(transparent)]
201pub struct HubItemListBlockType(pub String);
202
203impl HubItemListBlockType {
204 pub const ITEM_LIST: &'static str = "item_list";
205}
206
207#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
208#[serde(transparent)]
209pub struct HubParagraphTextBlockType(pub String);
210
211impl HubParagraphTextBlockType {
212 pub const PARAGRAPH: &'static str = "paragraph";
213}
214
215#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
216#[serde(transparent)]
217pub struct HubSectionTitleTextBlockType(pub String);
218
219impl HubSectionTitleTextBlockType {
220 pub const SECTION_TITLE: &'static str = "section_title";
221}