notionrs_types/object/page/
created_time.rs

1use serde::{Deserialize, Serialize};
2
3/// <https://developers.notion.com/reference/page-property-values#created-time>
4///
5/// - `$.['*'].id`: An underlying identifier for the property.
6///   `id` remains constant when the property name changes.
7/// - `$.['*'].type`: Always `"created_time"`
8/// - `$.['*'].created_time`: The date and time that the page was created.
9///   The created_time value can’t be updated.
10///
11/// **Note**: The `['*']` part represents the column name you set when creating the database.
12///
13/// Example created_time page property value
14///
15/// ```json
16/// {
17///   "Created time": {
18///     "id": "sv%3Fi",
19///     "type": "created_time",
20///     "created_time": "2024-04-03T10:55:00.000Z"
21///   }
22/// }
23/// ```
24#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq, notionrs_macro::Setter)]
25pub struct PageCreatedTimeProperty {
26    /// An underlying identifier for the property.
27    /// `id` remains constant when the property name changes.
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub id: Option<String>,
30
31    /// The date and time that the page was created.
32    /// The created_time value can’t be updated.
33    #[serde(with = "time::serde::rfc3339")]
34    pub created_time: time::OffsetDateTime,
35}
36
37impl Default for PageCreatedTimeProperty {
38    fn default() -> Self {
39        Self {
40            id: None,
41            created_time: time::OffsetDateTime::now_utc(),
42        }
43    }
44}
45
46impl std::fmt::Display for PageCreatedTimeProperty {
47    /// display the created time in RFC3339 format
48    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
49        write!(
50            f,
51            "{}",
52            self.created_time
53                .format(&time::format_description::well_known::Rfc3339)
54                .unwrap()
55        )
56    }
57}
58
59// # --------------------------------------------------------------------------------
60//
61// unit test
62//
63// # --------------------------------------------------------------------------------
64
65#[cfg(test)]
66mod unit_tests {
67
68    use super::*;
69
70    #[test]
71    fn deserialize_page_created_time_property() {
72        let json_data = r#"
73        {
74            "Created time": {
75                "id": "sv%3Fi",
76                "type": "created_time",
77                "created_time": "2024-04-03T10:55:00.000Z"
78            }
79        }
80        "#;
81
82        let created_time_map = serde_json::from_str::<
83            std::collections::HashMap<String, PageCreatedTimeProperty>,
84        >(json_data)
85        .unwrap();
86
87        let created_time = created_time_map.get("Created time").unwrap();
88
89        assert_eq!(created_time.id, Some("sv%3Fi".to_string()));
90
91        let expected_created_time = time::OffsetDateTime::new_utc(
92            time::Date::from_calendar_date(2024, time::Month::April, 3).unwrap(),
93            time::Time::from_hms(10, 55, 0).unwrap(),
94        );
95        assert_eq!(created_time.created_time, expected_created_time);
96    }
97}