1use crate::types::EntityId;
4use crate::types::HasId;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, PartialEq, 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, 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 character_count: i64,
33 pub block_count: i64,
34}
35
36impl HasId for Document {
37 fn id(&self) -> EntityId {
38 self.id
39 }
40}
41#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
42pub enum TextDirection {
43 #[default]
44 LeftToRight,
45 RightToLeft,
46}
47#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
48pub enum WrapMode {
49 #[default]
50 NoWrap,
51 WordWrap,
52 WrapAnywhere,
53 WrapAtWordBoundaryOrAnywhere,
54}
55
56#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
57pub struct Frame {
58 pub id: EntityId,
59 pub created_at: chrono::DateTime<chrono::Utc>,
60 pub updated_at: chrono::DateTime<chrono::Utc>,
61 pub parent_frame: Option<EntityId>,
62 pub blocks: Vec<EntityId>,
63 pub child_order: Vec<i64>,
64 pub fmt_height: Option<i64>,
65 pub fmt_width: Option<i64>,
66 pub fmt_top_margin: Option<i64>,
67 pub fmt_bottom_margin: Option<i64>,
68 pub fmt_left_margin: Option<i64>,
69 pub fmt_right_margin: Option<i64>,
70 pub fmt_padding: Option<i64>,
71 pub fmt_border: Option<i64>,
72 pub fmt_position: Option<FramePosition>,
73}
74
75impl HasId for Frame {
76 fn id(&self) -> EntityId {
77 self.id
78 }
79}
80#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
81pub enum FramePosition {
82 #[default]
83 InFlow,
84 FloatLeft,
85 FloatRight,
86}
87
88#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
89pub struct Block {
90 pub id: EntityId,
91 pub created_at: chrono::DateTime<chrono::Utc>,
92 pub updated_at: chrono::DateTime<chrono::Utc>,
93 pub elements: Vec<EntityId>,
94 pub list: Option<EntityId>,
95 pub text_length: i64,
96 pub document_position: i64,
97 pub plain_text: String,
98 pub fmt_alignment: Option<Alignment>,
99 pub fmt_top_margin: Option<i64>,
100 pub fmt_bottom_margin: Option<i64>,
101 pub fmt_left_margin: Option<i64>,
102 pub fmt_right_margin: Option<i64>,
103 pub fmt_heading_level: Option<i64>,
104 pub fmt_indent: Option<i64>,
105 pub fmt_text_indent: Option<i64>,
106 pub fmt_marker: Option<MarkerType>,
107 pub fmt_tab_positions: Vec<i64>,
108}
109
110impl HasId for Block {
111 fn id(&self) -> EntityId {
112 self.id
113 }
114}
115#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
116pub enum Alignment {
117 #[default]
118 Left,
119 Right,
120 Center,
121 Justify,
122}
123#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
124pub enum MarkerType {
125 #[default]
126 NoMarker,
127 Unchecked,
128 Checked,
129}
130
131#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
132pub struct InlineElement {
133 pub id: EntityId,
134 pub created_at: chrono::DateTime<chrono::Utc>,
135 pub updated_at: chrono::DateTime<chrono::Utc>,
136 pub content: InlineContent,
137 pub fmt_font_family: Option<String>,
138 pub fmt_font_point_size: Option<i64>,
139 pub fmt_font_weight: Option<i64>,
140 pub fmt_font_bold: Option<bool>,
141 pub fmt_font_italic: Option<bool>,
142 pub fmt_font_underline: Option<bool>,
143 pub fmt_font_overline: Option<bool>,
144 pub fmt_font_strikeout: Option<bool>,
145 pub fmt_letter_spacing: Option<i64>,
146 pub fmt_word_spacing: Option<i64>,
147 pub fmt_anchor_href: Option<String>,
148 pub fmt_anchor_names: Vec<String>,
149 pub fmt_is_anchor: Option<bool>,
150 pub fmt_tooltip: Option<String>,
151 pub fmt_underline_style: Option<UnderlineStyle>,
152 pub fmt_vertical_alignment: Option<CharVerticalAlignment>,
153}
154
155impl HasId for InlineElement {
156 fn id(&self) -> EntityId {
157 self.id
158 }
159}
160#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
161pub enum InlineContent {
162 #[default]
163 Empty,
164 Text(String),
165 Image {
166 name: String,
167 width: i64,
168 height: i64,
169 quality: i64,
170 },
171}
172#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
173pub enum UnderlineStyle {
174 #[default]
175 NoUnderline,
176 SingleUnderline,
177 DashUnderline,
178 DotLine,
179 DashDotLine,
180 DashDotDotLine,
181 WaveUnderline,
182 SpellCheckUnderline,
183}
184#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
185pub enum CharVerticalAlignment {
186 #[default]
187 Normal,
188 SuperScript,
189 SubScript,
190 Middle,
191 Bottom,
192 Top,
193 Baseline,
194}
195
196#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
197pub struct List {
198 pub id: EntityId,
199 pub created_at: chrono::DateTime<chrono::Utc>,
200 pub updated_at: chrono::DateTime<chrono::Utc>,
201 pub style: ListStyle,
202 pub indent: i64,
203 pub prefix: String,
204 pub suffix: String,
205}
206
207impl HasId for List {
208 fn id(&self) -> EntityId {
209 self.id
210 }
211}
212#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
213pub enum ListStyle {
214 #[default]
215 Disc,
216 Circle,
217 Square,
218 Decimal,
219 LowerAlpha,
220 UpperAlpha,
221 LowerRoman,
222 UpperRoman,
223}
224
225#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
226pub struct Resource {
227 pub id: EntityId,
228 pub created_at: chrono::DateTime<chrono::Utc>,
229 pub updated_at: chrono::DateTime<chrono::Utc>,
230 pub resource_type: ResourceType,
231 pub name: String,
232 pub url: String,
233 pub mime_type: String,
234 pub data_base64: String,
235}
236
237impl HasId for Resource {
238 fn id(&self) -> EntityId {
239 self.id
240 }
241}
242#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
243pub enum ResourceType {
244 #[default]
245 Image,
246 StyleSheet,
247 Other,
248}