aboutsummaryrefslogtreecommitdiff
path: root/src/models
diff options
context:
space:
mode:
Diffstat (limited to 'src/models')
-rw-r--r--src/models/properties.rs84
-rw-r--r--src/models/search.rs1
-rw-r--r--src/models/text.rs79
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,
+ },
+}