notion-client 1.1.1

A Rust client library for the Notion API
Documentation
use chrono::{DateTime, NaiveDate, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Number;
use serde_with::skip_serializing_none;

use super::{file::File, rich_text::RichText, user::User};

#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Property {
    Title {
        id: String,
        title: RichText,
    },
    RichText {
        id: String,
        rich_text: RichText,
    },
    Number {
        number: Number,
    },
    Select {
        id: String,
        name: String,
        color: Color,
    },
    Status {
        id: String,
        name: String,
        color: Color,
    },
    MultiSelect {
        id: String,
        multi_select: Vec<SelectPropertyValue>,
    },
    Date {
        id: String,
        date: DatePropertyValue,
    },
    Formula {
        id: String,
        formula: FormulaPropertyValue,
    },
    Relation {
        id: String,
        relation: RelationPropertyValue,
    },
    Rollup {
        id: String,
        rollup: RollupPropertyValue,
    },
    People {
        id: String,
        people: Vec<User>,
    },
    Files {
        id: String,
        files: Vec<FilePropertyValue>,
    },
    Checkbox {
        id: String,
        checkbox: bool,
    },
    Url {
        id: String,
        url: String,
    },
    Email {
        id: String,
        email: String,
    },
    PhoneNumber {
        id: String,
        phone_number: String,
    },
    CreatedTime {
        id: String,
        created_time: DateTime<Utc>,
    },
    CreatedBy {
        id: String,
        created_by: User,
    },
    LastEditedTime {
        id: String,
        last_edited_time: DateTime<Utc>,
    },
    LastEditedBy {
        id: String,
        last_edited_by: User,
    },
}

#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
#[serde(rename_all = "snake_case")]
pub enum Color {
    Default,
    Gray,
    Brown,
    Red,
    Orange,
    Yellow,
    Green,
    Blue,
    Purple,
    Pink,
}

#[skip_serializing_none]
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone, Default)]
pub struct SelectPropertyValue {
    pub id: Option<String>,
    pub name: Option<String>,
    pub color: Option<Color>,
}

#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
pub struct DatePropertyValue {
    pub start: Option<DateOrDateTime>,
    pub end: Option<DateOrDateTime>,
    pub time_zone: Option<String>,
}

#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
#[serde(untagged)]
pub enum DateOrDateTime {
    Date(NaiveDate),
    DateTime(DateTime<Utc>),
}

#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum FormulaPropertyValue {
    String { string: Option<String> },
    Number { number: Option<Number> },
    Boolean { boolean: bool },
    Date { date: Option<DatePropertyValue> },
}

#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
pub struct RelationPropertyValue {
    pub id: String,
}

#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum RollupPropertyValue {
    String { string: Option<String> },
    Number { number: Option<Number> },
    Date { date: DateTime<Utc> },
    Array { results: Vec<RollupPropertyValue> },
}

#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
pub struct FilePropertyValue {
    pub name: String,
    #[serde(flatten)]
    pub file: File,
}