1use crate::types::EntityId;
4use crate::types::HasId;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
8pub struct Root {
9 pub id: EntityId,
10 #[serde(with = "chrono::serde::ts_milliseconds")]
11 pub created_at: chrono::DateTime<chrono::Utc>,
12 #[serde(with = "chrono::serde::ts_milliseconds")]
13 pub updated_at: chrono::DateTime<chrono::Utc>,
14 pub document: EntityId,
15}
16
17impl HasId for Root {
18 fn id(&self) -> EntityId {
19 self.id
20 }
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
24pub struct Document {
25 pub id: EntityId,
26 #[serde(with = "chrono::serde::ts_milliseconds")]
27 pub created_at: chrono::DateTime<chrono::Utc>,
28 #[serde(with = "chrono::serde::ts_milliseconds")]
29 pub updated_at: chrono::DateTime<chrono::Utc>,
30 pub title: String,
31 pub frames: Vec<EntityId>,
32 pub text_direction: TextDirection,
33 pub default_wrap_mode: WrapMode,
34 pub resources: Vec<EntityId>,
35 pub lists: Vec<EntityId>,
36 pub tables: Vec<EntityId>,
37 pub character_count: i64,
38 pub block_count: i64,
39}
40
41impl HasId for Document {
42 fn id(&self) -> EntityId {
43 self.id
44 }
45}
46#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
47pub enum TextDirection {
48 #[default]
49 LeftToRight,
50 RightToLeft,
51}
52#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
53pub enum WrapMode {
54 #[default]
55 NoWrap,
56 WordWrap,
57 WrapAnywhere,
58 WrapAtWordBoundaryOrAnywhere,
59}
60
61#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
62pub struct Frame {
63 pub id: EntityId,
64 #[serde(with = "chrono::serde::ts_milliseconds")]
65 pub created_at: chrono::DateTime<chrono::Utc>,
66 #[serde(with = "chrono::serde::ts_milliseconds")]
67 pub updated_at: chrono::DateTime<chrono::Utc>,
68 pub parent_frame: Option<EntityId>,
69 pub blocks: Vec<EntityId>,
70 pub child_order: Vec<i64>,
71 pub fmt_height: Option<i64>,
72 pub fmt_width: Option<i64>,
73 pub fmt_top_margin: Option<i64>,
74 pub fmt_bottom_margin: Option<i64>,
75 pub fmt_left_margin: Option<i64>,
76 pub fmt_right_margin: Option<i64>,
77 pub fmt_padding: Option<i64>,
78 pub fmt_border: Option<i64>,
79 pub fmt_position: Option<FramePosition>,
80 pub fmt_is_blockquote: Option<bool>,
81 pub table: Option<EntityId>,
82}
83
84impl HasId for Frame {
85 fn id(&self) -> EntityId {
86 self.id
87 }
88}
89#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
90pub enum FramePosition {
91 #[default]
92 InFlow,
93 FloatLeft,
94 FloatRight,
95}
96
97#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
98pub struct Block {
99 pub id: EntityId,
100 #[serde(with = "chrono::serde::ts_milliseconds")]
101 pub created_at: chrono::DateTime<chrono::Utc>,
102 #[serde(with = "chrono::serde::ts_milliseconds")]
103 pub updated_at: chrono::DateTime<chrono::Utc>,
104 pub elements: Vec<EntityId>,
105 pub list: Option<EntityId>,
106 pub text_length: i64,
107 pub document_position: i64,
108 pub plain_text: String,
109 pub fmt_alignment: Option<Alignment>,
110 pub fmt_top_margin: Option<i64>,
111 pub fmt_bottom_margin: Option<i64>,
112 pub fmt_left_margin: Option<i64>,
113 pub fmt_right_margin: Option<i64>,
114 pub fmt_heading_level: Option<i64>,
115 pub fmt_indent: Option<i64>,
116 pub fmt_text_indent: Option<i64>,
117 pub fmt_marker: Option<MarkerType>,
118 pub fmt_tab_positions: Vec<i64>,
119 pub fmt_line_height: Option<i64>,
120 pub fmt_non_breakable_lines: Option<bool>,
121 pub fmt_direction: Option<TextDirection>,
122 pub fmt_background_color: Option<String>,
123 pub fmt_is_code_block: Option<bool>,
124 pub fmt_code_language: Option<String>,
125}
126
127impl HasId for Block {
128 fn id(&self) -> EntityId {
129 self.id
130 }
131}
132#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
133pub enum Alignment {
134 #[default]
135 Left,
136 Right,
137 Center,
138 Justify,
139}
140#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
141pub enum MarkerType {
142 #[default]
143 NoMarker,
144 Unchecked,
145 Checked,
146}
147
148#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
149pub struct InlineElement {
150 pub id: EntityId,
151 #[serde(with = "chrono::serde::ts_milliseconds")]
152 pub created_at: chrono::DateTime<chrono::Utc>,
153 #[serde(with = "chrono::serde::ts_milliseconds")]
154 pub updated_at: chrono::DateTime<chrono::Utc>,
155 pub content: InlineContent,
156 pub fmt_font_family: Option<String>,
157 pub fmt_font_point_size: Option<i64>,
158 pub fmt_font_weight: Option<i64>,
159 pub fmt_font_bold: Option<bool>,
160 pub fmt_font_italic: Option<bool>,
161 pub fmt_font_underline: Option<bool>,
162 pub fmt_font_overline: Option<bool>,
163 pub fmt_font_strikeout: Option<bool>,
164 pub fmt_letter_spacing: Option<i64>,
165 pub fmt_word_spacing: Option<i64>,
166 pub fmt_anchor_href: Option<String>,
167 pub fmt_anchor_names: Vec<String>,
168 pub fmt_is_anchor: Option<bool>,
169 pub fmt_tooltip: Option<String>,
170 pub fmt_underline_style: Option<UnderlineStyle>,
171 pub fmt_vertical_alignment: Option<CharVerticalAlignment>,
172}
173
174impl HasId for InlineElement {
175 fn id(&self) -> EntityId {
176 self.id
177 }
178}
179#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
180pub enum InlineContent {
181 #[default]
182 Empty,
183 Text(String),
184 Image {
185 name: String,
186 width: i64,
187 height: i64,
188 quality: i64,
189 },
190}
191#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
192pub enum UnderlineStyle {
193 #[default]
194 NoUnderline,
195 SingleUnderline,
196 DashUnderline,
197 DotLine,
198 DashDotLine,
199 DashDotDotLine,
200 WaveUnderline,
201 SpellCheckUnderline,
202}
203#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
204pub enum CharVerticalAlignment {
205 #[default]
206 Normal,
207 SuperScript,
208 SubScript,
209 Middle,
210 Bottom,
211 Top,
212 Baseline,
213}
214
215#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
216pub struct List {
217 pub id: EntityId,
218 #[serde(with = "chrono::serde::ts_milliseconds")]
219 pub created_at: chrono::DateTime<chrono::Utc>,
220 #[serde(with = "chrono::serde::ts_milliseconds")]
221 pub updated_at: chrono::DateTime<chrono::Utc>,
222 pub style: ListStyle,
223 pub indent: i64,
224 pub prefix: String,
225 pub suffix: String,
226}
227
228impl HasId for List {
229 fn id(&self) -> EntityId {
230 self.id
231 }
232}
233#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
234pub enum ListStyle {
235 #[default]
236 Disc,
237 Circle,
238 Square,
239 Decimal,
240 LowerAlpha,
241 UpperAlpha,
242 LowerRoman,
243 UpperRoman,
244}
245
246#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
247pub struct Resource {
248 pub id: EntityId,
249 #[serde(with = "chrono::serde::ts_milliseconds")]
250 pub created_at: chrono::DateTime<chrono::Utc>,
251 #[serde(with = "chrono::serde::ts_milliseconds")]
252 pub updated_at: chrono::DateTime<chrono::Utc>,
253 pub resource_type: ResourceType,
254 pub name: String,
255 pub url: String,
256 pub mime_type: String,
257 pub data_base64: String,
258}
259
260impl HasId for Resource {
261 fn id(&self) -> EntityId {
262 self.id
263 }
264}
265#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
266pub enum ResourceType {
267 #[default]
268 Image,
269 StyleSheet,
270 Other,
271}
272
273#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
274pub struct Table {
275 pub id: EntityId,
276 #[serde(with = "chrono::serde::ts_milliseconds")]
277 pub created_at: chrono::DateTime<chrono::Utc>,
278 #[serde(with = "chrono::serde::ts_milliseconds")]
279 pub updated_at: chrono::DateTime<chrono::Utc>,
280 pub cells: Vec<EntityId>,
281 pub rows: i64,
282 pub columns: i64,
283 pub column_widths: Vec<i64>,
284 pub fmt_border: Option<i64>,
285 pub fmt_cell_spacing: Option<i64>,
286 pub fmt_cell_padding: Option<i64>,
287 pub fmt_width: Option<i64>,
288 pub fmt_alignment: Option<Alignment>,
289}
290
291impl HasId for Table {
292 fn id(&self) -> EntityId {
293 self.id
294 }
295}
296
297#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
298pub struct TableCell {
299 pub id: EntityId,
300 #[serde(with = "chrono::serde::ts_milliseconds")]
301 pub created_at: chrono::DateTime<chrono::Utc>,
302 #[serde(with = "chrono::serde::ts_milliseconds")]
303 pub updated_at: chrono::DateTime<chrono::Utc>,
304 pub row: i64,
305 pub column: i64,
306 pub row_span: i64,
307 pub column_span: i64,
308 pub cell_frame: Option<EntityId>,
309 pub fmt_padding: Option<i64>,
310 pub fmt_border: Option<i64>,
311 pub fmt_vertical_alignment: Option<CellVerticalAlignment>,
312 pub fmt_background_color: Option<String>,
313}
314
315impl HasId for TableCell {
316 fn id(&self) -> EntityId {
317 self.id
318 }
319}
320#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
321pub enum CellVerticalAlignment {
322 #[default]
323 Top,
324 Middle,
325 Bottom,
326}