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