diff --git a/src/lib.rs b/src/lib.rs index a64a3db..f90ec35 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -180,6 +180,9 @@ pub fn parse_site_native_file(xml_path: &Path) -> Result { /// keep_history: true, /// entries: Some(vec![Entry { /// entry_id: "1".to_string(), +/// reviewed_by: None, +/// reviewed_by_unique_id: None, +/// reviewed_by_when: None, /// value: Some(Value { /// by: "Paul Sanders".to_string(), /// by_unique_id: Some("1681162687395".to_string()), @@ -209,6 +212,9 @@ pub fn parse_site_native_file(xml_path: &Path) -> Result { /// entries: Some(vec![ /// Entry { /// entry_id: "1".to_string(), +/// reviewed_by: None, +/// reviewed_by_unique_id: None, +/// reviewed_by_when: None, /// value: Some(Value { /// by: "set from calculation".to_string(), /// by_unique_id: None, @@ -234,6 +240,9 @@ pub fn parse_site_native_file(xml_path: &Path) -> Result { /// }, /// Entry { /// entry_id: "2".to_string(), +/// reviewed_by: None, +/// reviewed_by_unique_id: None, +/// reviewed_by_when: None, /// value: Some(Value { /// by: "set from calculation".to_string(), /// by_unique_id: None, @@ -294,6 +303,9 @@ pub fn parse_site_native_file(xml_path: &Path) -> Result { /// keep_history: true, /// entries: Some(vec![Entry { /// entry_id: "1".to_string(), +/// reviewed_by: None, +/// reviewed_by_unique_id: None, +/// reviewed_by_when: None, /// value: Some(Value { /// by: "Paul Sanders".to_string(), /// by_unique_id: Some("1681162687395".to_string()), @@ -383,6 +395,9 @@ pub fn parse_site_native_file(xml_path: &Path) -> Result { /// keep_history: true, /// entries: Some(vec![Entry { /// entry_id: "1".to_string(), +/// reviewed_by: None, +/// reviewed_by_unique_id: None, +/// reviewed_by_when: None, /// value: Some(Value { /// by: "Paul Sanders".to_string(), /// by_unique_id: Some("1681162687395".to_string()), @@ -536,6 +551,9 @@ pub fn parse_subject_native_file(xml_path: &Path) -> Result Result Result { /// keep_history: true, /// entries: Some(vec![Entry { /// entry_id: "1".to_string(), +/// reviewed_by: None, +/// reviewed_by_unique_id: None, +/// reviewed_by_when: None, /// value: Some(Value { /// by: "Paul Sanders".to_string(), /// by_unique_id: Some("1681162687395".to_string()), @@ -1047,6 +1071,9 @@ pub fn parse_user_native_file(xml_path: &Path) -> Result { /// entries: Some(vec![ /// Entry { /// entry_id: "1".to_string(), +/// reviewed_by: None, +/// reviewed_by_unique_id: None, +/// reviewed_by_when: None, /// value: Some(Value { /// by: "set from calculation".to_string(), /// by_unique_id: None, diff --git a/src/native/common.rs b/src/native/common.rs index f6040a5..e6fcb04 100644 --- a/src/native/common.rs +++ b/src/native/common.rs @@ -238,18 +238,74 @@ pub struct Entry { #[serde(alias = "@id")] #[serde(alias = "entryId")] pub entry_id: String, + + #[serde(rename = "reviewedBy")] + #[serde(alias = "@reviewedBy")] + #[serde(alias = "reviewedBy")] + #[serde( + default = "default_string_none", + deserialize_with = "deserialize_empty_string_as_none" + )] + pub reviewed_by: Option, + + #[serde(rename = "reviewedByUniqueId")] + #[serde(alias = "@reviewedByUniqueId")] + #[serde(alias = "reviewedByUniqueId")] + #[serde( + default = "default_string_none", + deserialize_with = "deserialize_empty_string_as_none" + )] + pub reviewed_by_unique_id: Option, + + #[serde(rename = "reviewedByWhen")] + #[serde(alias = "@reviewedByWhen")] + #[serde(alias = "reviewedByWhen")] + #[serde( + default = "default_datetime_none", + deserialize_with = "deserialize_empty_string_as_none_datetime" + )] + pub reviewed_by_when: Option>, + pub value: Option, pub reason: Option, } #[cfg(feature = "python")] #[derive(Clone, Debug, Deserialize, Serialize, PartialEq)] -#[pyclass(get_all)] +#[pyclass] pub struct Entry { #[serde(rename = "entryId")] #[serde(alias = "@id")] #[serde(alias = "entryId")] pub entry_id: String, + + #[serde(rename = "reviewedBy")] + #[serde(alias = "@reviewedBy")] + #[serde(alias = "reviewedBy")] + #[serde( + default = "default_string_none", + deserialize_with = "deserialize_empty_string_as_none" + )] + pub reviewed_by: Option, + + #[serde(rename = "reviewedByUniqueId")] + #[serde(alias = "@reviewedByUniqueId")] + #[serde(alias = "reviewedByUniqueId")] + #[serde( + default = "default_string_none", + deserialize_with = "deserialize_empty_string_as_none" + )] + pub reviewed_by_unique_id: Option, + + #[serde(rename = "reviewedByWhen")] + #[serde(alias = "@reviewedByWhen")] + #[serde(alias = "reviewedByWhen")] + #[serde( + default = "default_datetime_none", + deserialize_with = "deserialize_empty_string_as_none_datetime" + )] + pub reviewed_by_when: Option>, + pub value: Option, pub reason: Option, } @@ -262,6 +318,21 @@ impl Entry { Ok(self.entry_id.clone()) } + #[getter] + fn reviewed_by(&self) -> PyResult> { + Ok(self.reviewed_by.clone()) + } + + #[getter] + fn reviewed_by_unique_id(&self) -> PyResult> { + Ok(self.reviewed_by_unique_id.clone()) + } + + #[getter] + fn reviewed_by_when<'py>(&self, py: Python<'py>) -> PyResult>> { + to_py_datetime_option(py, &self.reviewed_by_when) + } + #[getter] fn value(&self) -> PyResult> { Ok(self.value.clone()) @@ -275,6 +346,12 @@ impl Entry { pub fn to_dict<'py>(&self, py: Python<'py>) -> PyResult> { let dict = PyDict::new(py); dict.set_item("entry_id", &self.entry_id)?; + dict.set_item("reviewed_by", &self.reviewed_by)?; + dict.set_item("reviewed_by_unique_id", &self.reviewed_by_unique_id)?; + dict.set_item( + "reviewed_by_when", + to_py_datetime_option(py, &self.reviewed_by_when)?, + )?; if let Some(value) = &self.value { dict.set_item("value", value.to_dict(py)?)?; } else { @@ -1362,8 +1439,27 @@ impl Entry { .cloned() .unwrap_or_default(); + let reviewed_by = attrs.get("reviewedBy").filter(|s| !s.is_empty()).cloned(); + let reviewed_by_unique_id = attrs + .get("reviewedByUniqueId") + .filter(|s| !s.is_empty()) + .cloned(); + + let reviewed_by_when = if let Some(rbw) = attrs.get("reviewedByWhen") { + if rbw.is_empty() { + None + } else { + parse_datetime_internal(rbw).ok() + } + } else { + None + }; + Ok(Entry { entry_id, + reviewed_by, + reviewed_by_unique_id, + reviewed_by_when, value: None, reason: None, }) diff --git a/src/native/snapshots/prelude_xml_parser__native__subject_native__tests__deserialize_subject_native_json.snap b/src/native/snapshots/prelude_xml_parser__native__subject_native__tests__deserialize_subject_native_json.snap index 9ecd936..26b9e9f 100644 --- a/src/native/snapshots/prelude_xml_parser__native__subject_native__tests__deserialize_subject_native_json.snap +++ b/src/native/snapshots/prelude_xml_parser__native__subject_native__tests__deserialize_subject_native_json.snap @@ -45,6 +45,9 @@ patients: keepHistory: true entries: - entryId: "1" + reviewedBy: ~ + reviewedByUniqueId: ~ + reviewedByWhen: ~ value: by: Paul Sanders byUniqueId: "1681162687395" @@ -95,6 +98,9 @@ patients: keepHistory: true entries: - entryId: "1" + reviewedBy: ~ + reviewedByUniqueId: ~ + reviewedByWhen: ~ value: by: Paul Sanders byUniqueId: "1681162687395" diff --git a/src/native/snapshots/prelude_xml_parser__native__user_native__tests__deserialize_user_native_json.snap b/src/native/snapshots/prelude_xml_parser__native__user_native__tests__deserialize_user_native_json.snap index 9d99ad8..fd8a7b6 100644 --- a/src/native/snapshots/prelude_xml_parser__native__user_native__tests__deserialize_user_native_json.snap +++ b/src/native/snapshots/prelude_xml_parser__native__user_native__tests__deserialize_user_native_json.snap @@ -49,6 +49,9 @@ users: keepHistory: true entries: - entryId: "1" + reviewedBy: ~ + reviewedByUniqueId: ~ + reviewedByWhen: ~ value: by: Paul Sanders byUniqueId: "1681162687395" @@ -69,6 +72,9 @@ users: keepHistory: true entries: - entryId: "1" + reviewedBy: ~ + reviewedByUniqueId: ~ + reviewedByWhen: ~ value: by: set from calculation byUniqueId: ~