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