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