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 table: Option<EntityId>,
81}
82
83impl HasId for Frame {
84 fn id(&self) -> EntityId {
85 self.id
86 }
87}
88#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
89pub enum FramePosition {
90 #[default]
91 InFlow,
92 FloatLeft,
93 FloatRight,
94}
95
96#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
97pub struct Block {
98 pub id: EntityId,
99 #[serde(with = "chrono::serde::ts_milliseconds")]
100 pub created_at: chrono::DateTime<chrono::Utc>,
101 #[serde(with = "chrono::serde::ts_milliseconds")]
102 pub updated_at: chrono::DateTime<chrono::Utc>,
103 pub elements: Vec<EntityId>,
104 pub list: Option<EntityId>,
105 pub text_length: i64,
106 pub document_position: i64,
107 pub plain_text: String,
108 pub fmt_alignment: Option<Alignment>,
109 pub fmt_top_margin: Option<i64>,
110 pub fmt_bottom_margin: Option<i64>,
111 pub fmt_left_margin: Option<i64>,
112 pub fmt_right_margin: Option<i64>,
113 pub fmt_heading_level: Option<i64>,
114 pub fmt_indent: Option<i64>,
115 pub fmt_text_indent: Option<i64>,
116 pub fmt_marker: Option<MarkerType>,
117 pub fmt_tab_positions: Vec<i64>,
118 pub fmt_line_height: Option<i64>,
119 pub fmt_non_breakable_lines: Option<bool>,
120 pub fmt_direction: Option<TextDirection>,
121 pub fmt_background_color: Option<String>,
122}
123
124impl HasId for Block {
125 fn id(&self) -> EntityId {
126 self.id
127 }
128}
129#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
130pub enum Alignment {
131 #[default]
132 Left,
133 Right,
134 Center,
135 Justify,
136}
137#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
138pub enum MarkerType {
139 #[default]
140 NoMarker,
141 Unchecked,
142 Checked,
143}
144
145#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
146pub struct InlineElement {
147 pub id: EntityId,
148 #[serde(with = "chrono::serde::ts_milliseconds")]
149 pub created_at: chrono::DateTime<chrono::Utc>,
150 #[serde(with = "chrono::serde::ts_milliseconds")]
151 pub updated_at: chrono::DateTime<chrono::Utc>,
152 pub content: InlineContent,
153 pub fmt_font_family: Option<String>,
154 pub fmt_font_point_size: Option<i64>,
155 pub fmt_font_weight: Option<i64>,
156 pub fmt_font_bold: Option<bool>,
157 pub fmt_font_italic: Option<bool>,
158 pub fmt_font_underline: Option<bool>,
159 pub fmt_font_overline: Option<bool>,
160 pub fmt_font_strikeout: Option<bool>,
161 pub fmt_letter_spacing: Option<i64>,
162 pub fmt_word_spacing: Option<i64>,
163 pub fmt_anchor_href: Option<String>,
164 pub fmt_anchor_names: Vec<String>,
165 pub fmt_is_anchor: Option<bool>,
166 pub fmt_tooltip: Option<String>,
167 pub fmt_underline_style: Option<UnderlineStyle>,
168 pub fmt_vertical_alignment: Option<CharVerticalAlignment>,
169}
170
171impl HasId for InlineElement {
172 fn id(&self) -> EntityId {
173 self.id
174 }
175}
176#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
177pub enum InlineContent {
178 #[default]
179 Empty,
180 Text(String),
181 Image {
182 name: String,
183 width: i64,
184 height: i64,
185 quality: i64,
186 },
187}
188#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
189pub enum UnderlineStyle {
190 #[default]
191 NoUnderline,
192 SingleUnderline,
193 DashUnderline,
194 DotLine,
195 DashDotLine,
196 DashDotDotLine,
197 WaveUnderline,
198 SpellCheckUnderline,
199}
200#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
201pub enum CharVerticalAlignment {
202 #[default]
203 Normal,
204 SuperScript,
205 SubScript,
206 Middle,
207 Bottom,
208 Top,
209 Baseline,
210}
211
212#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
213pub struct List {
214 pub id: EntityId,
215 #[serde(with = "chrono::serde::ts_milliseconds")]
216 pub created_at: chrono::DateTime<chrono::Utc>,
217 #[serde(with = "chrono::serde::ts_milliseconds")]
218 pub updated_at: chrono::DateTime<chrono::Utc>,
219 pub style: ListStyle,
220 pub indent: i64,
221 pub prefix: String,
222 pub suffix: String,
223}
224
225impl HasId for List {
226 fn id(&self) -> EntityId {
227 self.id
228 }
229}
230#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
231pub enum ListStyle {
232 #[default]
233 Disc,
234 Circle,
235 Square,
236 Decimal,
237 LowerAlpha,
238 UpperAlpha,
239 LowerRoman,
240 UpperRoman,
241}
242
243#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
244pub struct Resource {
245 pub id: EntityId,
246 #[serde(with = "chrono::serde::ts_milliseconds")]
247 pub created_at: chrono::DateTime<chrono::Utc>,
248 #[serde(with = "chrono::serde::ts_milliseconds")]
249 pub updated_at: chrono::DateTime<chrono::Utc>,
250 pub resource_type: ResourceType,
251 pub name: String,
252 pub url: String,
253 pub mime_type: String,
254 pub data_base64: String,
255}
256
257impl HasId for Resource {
258 fn id(&self) -> EntityId {
259 self.id
260 }
261}
262#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
263pub enum ResourceType {
264 #[default]
265 Image,
266 StyleSheet,
267 Other,
268}
269
270#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
271pub struct Table {
272 pub id: EntityId,
273 #[serde(with = "chrono::serde::ts_milliseconds")]
274 pub created_at: chrono::DateTime<chrono::Utc>,
275 #[serde(with = "chrono::serde::ts_milliseconds")]
276 pub updated_at: chrono::DateTime<chrono::Utc>,
277 pub cells: Vec<EntityId>,
278 pub rows: i64,
279 pub columns: i64,
280 pub column_widths: Vec<i64>,
281 pub fmt_border: Option<i64>,
282 pub fmt_cell_spacing: Option<i64>,
283 pub fmt_cell_padding: Option<i64>,
284 pub fmt_width: Option<i64>,
285 pub fmt_alignment: Option<Alignment>,
286}
287
288impl HasId for Table {
289 fn id(&self) -> EntityId {
290 self.id
291 }
292}
293
294#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
295pub struct TableCell {
296 pub id: EntityId,
297 #[serde(with = "chrono::serde::ts_milliseconds")]
298 pub created_at: chrono::DateTime<chrono::Utc>,
299 #[serde(with = "chrono::serde::ts_milliseconds")]
300 pub updated_at: chrono::DateTime<chrono::Utc>,
301 pub row: i64,
302 pub column: i64,
303 pub row_span: i64,
304 pub column_span: i64,
305 pub cell_frame: Option<EntityId>,
306 pub fmt_padding: Option<i64>,
307 pub fmt_border: Option<i64>,
308 pub fmt_vertical_alignment: Option<CellVerticalAlignment>,
309 pub fmt_background_color: Option<String>,
310}
311
312impl HasId for TableCell {
313 fn id(&self) -> EntityId {
314 self.id
315 }
316}
317#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
318pub enum CellVerticalAlignment {
319 #[default]
320 Top,
321 Middle,
322 Bottom,
323}