summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jake Swenson <jakeswenson@users.noreply.github.com> 2021-12-27 19:37:34 -0800
committerGravatar GitHub <noreply@github.com> 2021-12-28 03:37:34 +0000
commit397a38bb4d1dc5a2eef186906ee6570837efb2f5 (patch)
tree4250164288ecbc9bc638eccc1d3da7c333b423f7
parent1f66869e74edd7711d213ebf546acf75506c9cd3 (diff)
downloadnotion-397a38bb4d1dc5a2eef186906ee6570837efb2f5.tar.gz
notion-397a38bb4d1dc5a2eef186906ee6570837efb2f5.tar.zst
notion-397a38bb4d1dc5a2eef186906ee6570837efb2f5.zip
fix(#32): Fix rollup value parsing issues (#33)
Fixes #32: Rollup values were not being parsed correctly.
-rw-r--r--src/models/properties.rs83
-rw-r--r--src/models/properties/tests.rs24
-rw-r--r--src/models/properties/tests/rollup_property.json32
3 files changed, 130 insertions, 9 deletions
diff --git a/src/models/properties.rs b/src/models/properties.rs
index d04873e..0a2ed97 100644
--- a/src/models/properties.rs
+++ b/src/models/properties.rs
@@ -229,14 +229,11 @@ pub struct RelationValue {
}
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
-#[serde(tag = "type")]
-#[serde(rename_all = "snake_case")]
+#[serde(tag = "type", rename_all = "snake_case")]
pub enum RollupValue {
- Number(#[serde(rename = "number")] Option<Number>),
- Date(#[serde(rename = "date")] Option<DateTime<Utc>>),
- // Todo: these property values don't have id properties...
- // so this likely wont deserialize. would like to minimize duplicated code...
- Array(#[serde(rename = "array")] Vec<PropertyValue>),
+ Number { number: Option<Number> },
+ Date { date: Option<DateTime<Utc>> },
+ Array { array: Vec<RollupPropertyValue> },
}
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
@@ -290,9 +287,10 @@ pub enum PropertyValue {
id: PropertyId,
relation: Option<Vec<RelationValue>>,
},
+ /// <https://developers.notion.com/reference/page#rollup-property-values>
Rollup {
id: PropertyId,
- relation: Option<Rollup>,
+ rollup: Option<RollupValue>,
},
People {
id: PropertyId,
@@ -335,3 +333,72 @@ pub enum PropertyValue {
last_edited_by: User,
},
}
+
+/// <https://developers.notion.com/reference/page#rollup-property-value-element>
+#[derive(Serialize, Deserialize, Debug, Eq, PartialEq, Clone)]
+#[serde(tag = "type")]
+#[serde(rename_all = "snake_case")]
+pub enum RollupPropertyValue {
+ /// <https://developers.notion.com/reference/page#rich-text-property-values>
+ #[serde(rename = "rich_text")]
+ Text {
+ rich_text: Vec<RichText>,
+ },
+ /// <https://developers.notion.com/reference/page#number-property-values>
+ Number {
+ number: Option<Number>,
+ },
+ /// <https://developers.notion.com/reference/page#select-property-values>
+ Select {
+ select: Option<SelectedValue>,
+ },
+ MultiSelect {
+ multi_select: Option<Vec<SelectedValue>>,
+ },
+ Date {
+ date: Option<DateValue>,
+ },
+ /// <https://developers.notion.com/reference/page#formula-property-values>
+ Formula {
+ formula: FormulaResultValue,
+ },
+ /// <https://developers.notion.com/reference/page#relation-property-values>
+ /// It is actually an array of relations
+ Relation {
+ relation: Option<Vec<RelationValue>>,
+ },
+ /// <https://developers.notion.com/reference/page#rollup-property-values>
+ Rollup {
+ rollup: Option<RollupValue>,
+ },
+ People {
+ people: Vec<User>,
+ },
+ Files {
+ files: Option<Vec<FileReference>>,
+ },
+ Checkbox {
+ checkbox: bool,
+ },
+ Url {
+ url: Option<String>,
+ },
+ Email {
+ email: Option<String>,
+ },
+ PhoneNumber {
+ phone_number: String,
+ },
+ CreatedTime {
+ created_time: DateTime<Utc>,
+ },
+ CreatedBy {
+ created_by: User,
+ },
+ LastEditedTime {
+ last_edited_time: DateTime<Utc>,
+ },
+ LastEditedBy {
+ last_edited_by: User,
+ },
+}
diff --git a/src/models/properties/tests.rs b/src/models/properties/tests.rs
index 8fe5b42..022f080 100644
--- a/src/models/properties/tests.rs
+++ b/src/models/properties/tests.rs
@@ -1,4 +1,4 @@
-use super::{DateOrDateTime, PropertyValue};
+use super::{DateOrDateTime, PropertyValue, RollupPropertyValue, RollupValue};
use chrono::NaiveDate;
#[test]
@@ -32,3 +32,25 @@ fn parse_text_property_with_link() {
let _property: PropertyValue =
serde_json::from_str(include_str!("tests/text_with_link.json")).unwrap();
}
+
+#[test]
+fn parse_rollup_property() {
+ let property: PropertyValue =
+ serde_json::from_str(include_str!("tests/rollup_property.json")).unwrap();
+
+ assert!(matches!(
+ property,
+ PropertyValue::Rollup {
+ rollup: Some(RollupValue::Array { .. }),
+ ..
+ }
+ ));
+
+ if let PropertyValue::Rollup {
+ rollup: Some(RollupValue::Array { array }),
+ ..
+ } = property
+ {
+ assert!(matches!(array[0], RollupPropertyValue::Text { .. }))
+ }
+}
diff --git a/src/models/properties/tests/rollup_property.json b/src/models/properties/tests/rollup_property.json
new file mode 100644
index 0000000..c80d33b
--- /dev/null
+++ b/src/models/properties/tests/rollup_property.json
@@ -0,0 +1,32 @@
+{
+ "id": "R%7Cm%3F",
+ "type": "rollup",
+ "rollup": {
+ "type": "array",
+ "array": [
+ {
+ "type": "rich_text",
+ "rich_text": [
+ {
+ "type": "text",
+ "text": {
+ "content": "personal",
+ "link": null
+ },
+ "annotations": {
+ "bold": false,
+ "italic": false,
+ "strikethrough": false,
+ "underline": false,
+ "code": false,
+ "color": "default"
+ },
+ "plain_text": "personal",
+ "href": null
+ }
+ ]
+ }
+ ],
+ "function": "show_original"
+ }
+}