diff options
Diffstat (limited to 'src/models')
-rw-r--r-- | src/models/properties.rs | 84 | ||||
-rw-r--r-- | src/models/search.rs | 1 | ||||
-rw-r--r-- | src/models/text.rs | 79 |
3 files changed, 163 insertions, 1 deletions
diff --git a/src/models/properties.rs b/src/models/properties.rs new file mode 100644 index 0000000..cc59907 --- /dev/null +++ b/src/models/properties.rs @@ -0,0 +1,84 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] +#[serde(transparent)] +pub struct PropertyId(String); + +/// How the number is displayed in Notion. +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +#[serde(tag = "type")] +#[serde(rename_all = "snake_case")] +pub enum NumberFormat { + Number, + NumberWithCommas, + Percent, + Dollar, + Euro, + Pound, + Yen, + Ruble, + Rupee, + Won, + Yuan, +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] +#[serde(transparent)] +pub struct SelectOptionId(String); + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +#[serde(rename_all = "lowercase")] +pub enum Color { + Default, + Gray, + Brown, + Orange, + Yellow, + Green, + Blue, + Purple, + Pink, + Red, +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +pub struct SelectOption { + name: String, + id: SelectOptionId, + color: Color, +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +pub struct Select { + /// Sorted list of options available for this property. + options: Vec<SelectOption>, +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +#[serde(tag = "type")] +#[serde(rename_all = "snake_case")] +pub enum PropertyConfiguration { + /// Represents the special Title property required on every database. + /// See https://developers.notion.com/reference/database#title-configuration + Title { id: PropertyId }, + /// Represents a Text property + /// https://developers.notion.com/reference/database#text-configuration + #[serde(rename = "rich_text")] + Text { id: PropertyId }, + /// Represents a Number Property + /// See https://developers.notion.com/reference/database#number-configuration + Number { + id: PropertyId, + /// How the number is displayed in Notion. + format: NumberFormat, + }, + /// Represents a Select Property + /// See https://developers.notion.com/reference/database#select-configuration + Select { id: PropertyId, select: Select }, + /// Represents a Date Property + /// See https://developers.notion.com/reference/database#date-configuration + Date { id: PropertyId }, + /// Represents a File Property + /// See https://developers.notion.com/reference/database#date-configuration + File { id: PropertyId }, +} diff --git a/src/models/search.rs b/src/models/search.rs index dcbd206..32989e8 100644 --- a/src/models/search.rs +++ b/src/models/search.rs @@ -1,4 +1,3 @@ -use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Hash, Copy, Clone)] diff --git a/src/models/text.rs b/src/models/text.rs new file mode 100644 index 0000000..0baf183 --- /dev/null +++ b/src/models/text.rs @@ -0,0 +1,79 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +#[serde(rename_all = "snake_case")] +pub enum TextColor { + Default, + Gray, + Brown, + Orange, + Yellow, + Green, + Blue, + Purple, + Pink, + Red, + GrayBackground, + BrownBackground, + OrangeBackground, + YellowBackground, + GreenBackground, + BlueBackground, + PurpleBackground, + PinkBackground, + RedBackground, +} + +/// Rich text annotations +/// See https://developers.notion.com/reference/rich-text#annotations +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +struct Annotations { + bold: bool, + code: bool, + color: TextColor, + italic: bool, + strikethrough: bool, + underline: bool, +} + +/// Properties common on all rich text objects +/// See https://developers.notion.com/reference/rich-text#all-rich-text +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +pub struct RichTextCommon { + plain_text: String, + href: Option<String>, + annotations: Annotations, +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +pub struct Link { + url: String, +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +pub struct Text { + content: String, + link: Option<String>, +} + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +#[serde(tag = "type")] +#[serde(rename_all = "snake_case")] +pub enum RichText { + /// See https://developers.notion.com/reference/rich-text#text-objects + Text { + #[serde(flatten)] + rich_text: RichTextCommon, + text: Text, + }, + /// See https://developers.notion.com/reference/rich-text#mention-objects + Mention { + #[serde(flatten)] + rich_text: RichTextCommon, + }, + /// See https://developers.notion.com/reference/rich-text#equation-objects + Equation { + #[serde(flatten)] + rich_text: RichTextCommon, + }, +} |