Closed
Description
I've tried using the library to serialize/deserialize XML for an API but I didn't get far.
There's two tests at the bottom producing this behaviour.
When deserializing, the error is thread 'api::tests::deserialize' panicked at 'called
Result::unwrap()on an
Errvalue: Custom("missing field
RequestTimestamp")'
.
When serializing, the output (using --nocapture) is <OJP><OJPRequest><ServiceRequest><RequestTimestamp>2022-03-24T07:56:40.192049665Z</RequestTimestamp></ServiceRequest></OJPRequest></OJP>
.
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
struct OJP(OJPRequest);
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
struct OJPRequest(ServiceRequest);
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
struct ServiceRequest {
request_timestamp: RequestTimestamp,
}
#[derive(Serialize, Deserialize, derive_more::From)]
struct RequestTimestamp(DateTime<Utc>);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn deserialize() {
let xml = r#"<OJP><OJPRequest><ServiceRequest><RequestTimestamp>2022-03-24T07:48:03.571299970Z</RequestTimestamp></ServiceRequest></OJPRequest></OJP>"#;
let ojp: OJP = quick_xml::de::from_str(xml).unwrap();
}
#[test]
fn serialize() {
let ojp = OJP(OJPRequest(ServiceRequest {
request_timestamp: Utc::now().into(),
}));
println!("{}", quick_xml::se::to_string(&ojp).unwrap());
}
}
Modifying the xml string like this solves the issue and the library expects RequestTimestamp
to be somewhere else.
let xml = r#"<OJP><RequestTimestamp>2022-03-24T07:48:03.571299970Z</RequestTimestamp><OJPRequest><ServiceRequest></ServiceRequest></OJPRequest></OJP>"#;