use crate::types::EntityId;
use crate::types::HasId;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct Root {
pub id: EntityId,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub created_at: chrono::DateTime<chrono::Utc>,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub updated_at: chrono::DateTime<chrono::Utc>,
pub document: EntityId,
}
impl HasId for Root {
fn id(&self) -> EntityId {
self.id
}
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct Document {
pub id: EntityId,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub created_at: chrono::DateTime<chrono::Utc>,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub updated_at: chrono::DateTime<chrono::Utc>,
pub title: String,
pub frames: Vec<EntityId>,
pub text_direction: TextDirection,
pub default_wrap_mode: WrapMode,
pub resources: Vec<EntityId>,
pub lists: Vec<EntityId>,
pub tables: Vec<EntityId>,
pub character_count: i64,
pub block_count: i64,
}
impl HasId for Document {
fn id(&self) -> EntityId {
self.id
}
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
pub enum TextDirection {
#[default]
LeftToRight,
RightToLeft,
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
pub enum WrapMode {
#[default]
NoWrap,
WordWrap,
WrapAnywhere,
WrapAtWordBoundaryOrAnywhere,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct Frame {
pub id: EntityId,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub created_at: chrono::DateTime<chrono::Utc>,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub updated_at: chrono::DateTime<chrono::Utc>,
pub parent_frame: Option<EntityId>,
pub blocks: Vec<EntityId>,
pub child_order: Vec<i64>,
pub fmt_height: Option<i64>,
pub fmt_width: Option<i64>,
pub fmt_top_margin: Option<i64>,
pub fmt_bottom_margin: Option<i64>,
pub fmt_left_margin: Option<i64>,
pub fmt_right_margin: Option<i64>,
pub fmt_padding: Option<i64>,
pub fmt_border: Option<i64>,
pub fmt_position: Option<FramePosition>,
pub fmt_is_blockquote: Option<bool>,
pub table: Option<EntityId>,
}
impl HasId for Frame {
fn id(&self) -> EntityId {
self.id
}
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
pub enum FramePosition {
#[default]
InFlow,
FloatLeft,
FloatRight,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct Block {
pub id: EntityId,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub created_at: chrono::DateTime<chrono::Utc>,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub updated_at: chrono::DateTime<chrono::Utc>,
pub elements: Vec<EntityId>,
pub list: Option<EntityId>,
pub text_length: i64,
pub document_position: i64,
pub plain_text: String,
pub fmt_alignment: Option<Alignment>,
pub fmt_top_margin: Option<i64>,
pub fmt_bottom_margin: Option<i64>,
pub fmt_left_margin: Option<i64>,
pub fmt_right_margin: Option<i64>,
pub fmt_heading_level: Option<i64>,
pub fmt_indent: Option<i64>,
pub fmt_text_indent: Option<i64>,
pub fmt_marker: Option<MarkerType>,
pub fmt_tab_positions: Vec<i64>,
pub fmt_line_height: Option<i64>,
pub fmt_non_breakable_lines: Option<bool>,
pub fmt_direction: Option<TextDirection>,
pub fmt_background_color: Option<String>,
pub fmt_is_code_block: Option<bool>,
pub fmt_code_language: Option<String>,
}
impl HasId for Block {
fn id(&self) -> EntityId {
self.id
}
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
pub enum Alignment {
#[default]
Left,
Right,
Center,
Justify,
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
pub enum MarkerType {
#[default]
NoMarker,
Unchecked,
Checked,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct InlineElement {
pub id: EntityId,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub created_at: chrono::DateTime<chrono::Utc>,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub updated_at: chrono::DateTime<chrono::Utc>,
pub content: InlineContent,
pub fmt_font_family: Option<String>,
pub fmt_font_point_size: Option<i64>,
pub fmt_font_weight: Option<i64>,
pub fmt_font_bold: Option<bool>,
pub fmt_font_italic: Option<bool>,
pub fmt_font_underline: Option<bool>,
pub fmt_font_overline: Option<bool>,
pub fmt_font_strikeout: Option<bool>,
pub fmt_letter_spacing: Option<i64>,
pub fmt_word_spacing: Option<i64>,
pub fmt_anchor_href: Option<String>,
pub fmt_anchor_names: Vec<String>,
pub fmt_is_anchor: Option<bool>,
pub fmt_tooltip: Option<String>,
pub fmt_underline_style: Option<UnderlineStyle>,
pub fmt_vertical_alignment: Option<CharVerticalAlignment>,
}
impl HasId for InlineElement {
fn id(&self) -> EntityId {
self.id
}
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
pub enum InlineContent {
#[default]
Empty,
Text(String),
Image {
name: String,
width: i64,
height: i64,
quality: i64,
},
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
pub enum UnderlineStyle {
#[default]
NoUnderline,
SingleUnderline,
DashUnderline,
DotLine,
DashDotLine,
DashDotDotLine,
WaveUnderline,
SpellCheckUnderline,
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
pub enum CharVerticalAlignment {
#[default]
Normal,
SuperScript,
SubScript,
Middle,
Bottom,
Top,
Baseline,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct List {
pub id: EntityId,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub created_at: chrono::DateTime<chrono::Utc>,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub updated_at: chrono::DateTime<chrono::Utc>,
pub style: ListStyle,
pub indent: i64,
pub prefix: String,
pub suffix: String,
}
impl HasId for List {
fn id(&self) -> EntityId {
self.id
}
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
pub enum ListStyle {
#[default]
Disc,
Circle,
Square,
Decimal,
LowerAlpha,
UpperAlpha,
LowerRoman,
UpperRoman,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct Resource {
pub id: EntityId,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub created_at: chrono::DateTime<chrono::Utc>,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub updated_at: chrono::DateTime<chrono::Utc>,
pub resource_type: ResourceType,
pub name: String,
pub url: String,
pub mime_type: String,
pub data_base64: String,
}
impl HasId for Resource {
fn id(&self) -> EntityId {
self.id
}
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
pub enum ResourceType {
#[default]
Image,
StyleSheet,
Other,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct Table {
pub id: EntityId,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub created_at: chrono::DateTime<chrono::Utc>,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub updated_at: chrono::DateTime<chrono::Utc>,
pub cells: Vec<EntityId>,
pub rows: i64,
pub columns: i64,
pub column_widths: Vec<i64>,
pub fmt_border: Option<i64>,
pub fmt_cell_spacing: Option<i64>,
pub fmt_cell_padding: Option<i64>,
pub fmt_width: Option<i64>,
pub fmt_alignment: Option<Alignment>,
}
impl HasId for Table {
fn id(&self) -> EntityId {
self.id
}
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct TableCell {
pub id: EntityId,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub created_at: chrono::DateTime<chrono::Utc>,
#[serde(with = "chrono::serde::ts_milliseconds")]
pub updated_at: chrono::DateTime<chrono::Utc>,
pub row: i64,
pub column: i64,
pub row_span: i64,
pub column_span: i64,
pub cell_frame: Option<EntityId>,
pub fmt_padding: Option<i64>,
pub fmt_border: Option<i64>,
pub fmt_vertical_alignment: Option<CellVerticalAlignment>,
pub fmt_background_color: Option<String>,
}
impl HasId for TableCell {
fn id(&self) -> EntityId {
self.id
}
}
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]
pub enum CellVerticalAlignment {
#[default]
Top,
Middle,
Bottom,
}