diff options
author | 2021-05-14 07:18:20 -0700 | |
---|---|---|
committer | 2021-05-14 07:18:20 -0700 | |
commit | f7ef8d6d7f009990ba0c6be61cca507f097673b6 (patch) | |
tree | 1b58a5a8ca08f8fe8bb2a71ae832db21dd4953c0 /src/models.rs | |
parent | 5b3816b043f3e97878b04b948241466a2527b94d (diff) | |
download | notion-f7ef8d6d7f009990ba0c6be61cca507f097673b6.tar.gz notion-f7ef8d6d7f009990ba0c6be61cca507f097673b6.tar.zst notion-f7ef8d6d7f009990ba0c6be61cca507f097673b6.zip |
First pass at a working Notion api client from the public beta
Diffstat (limited to 'src/models.rs')
-rw-r--r-- | src/models.rs | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/src/models.rs b/src/models.rs new file mode 100644 index 0000000..c11c97b --- /dev/null +++ b/src/models.rs @@ -0,0 +1,222 @@ +pub mod search; + +use serde::{Serialize, Deserialize}; +use chrono::{DateTime, Utc}; +use std::collections::HashMap; + +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] +#[serde(rename_all = "lowercase")] +enum ObjectType { + Database, + List, +} + +/// A zero-cost wrapper type around a Database ID +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] +#[serde(transparent)] +pub struct DatabaseId(String); + +/// Represents a Notion Database +/// See https://developers.notion.com/reference/database +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +pub struct Database { + /// Always "database" + object: ObjectType, + /// Unique identifier for the database. + id: DatabaseId, + /// Date and time when this database was created. + created_time: DateTime<Utc>, + /// Date and time when this database was updated. + last_edited_time: DateTime<Utc>, + /// Name of the database as it appears in Notion. + title: Vec<RichText>, + /// Schema of properties for the database as they appear in Notion. + // + // key string + // The name of the property as it appears in Notion. + // + // value object + // A Property object. + properties: HashMap<String, PropertyConfiguration>, +} + +#[derive(Serialize, Deserialize, Eq, PartialEq, Debug)] +pub struct ListResponse<T> { + object: ObjectType, + results: Vec<T>, + next_cursor: Option<String>, + has_more: bool, +} + +#[derive(Serialize, Deserialize, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)] +#[serde(transparent)] +struct PropertyId(String); + +/// How the number is displayed in Notion. +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +#[serde(tag = "type")] +#[serde(rename_all = "snake_case")] +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 + }, +} + +#[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)] +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, + + }, +} |