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