Skip to content

Commit

Permalink
feat: Ergonomic deserialize (unoptimised version)
Browse files Browse the repository at this point in the history
  • Loading branch information
TmLev committed Jul 1, 2023
1 parent cd7ee0f commit 5a35bcf
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1374,6 +1374,13 @@ impl Payload {
pub fn insert(&mut self, key: impl ToString, val: impl Into<Value>) {
self.0.insert(key.to_string(), val.into());
}

/// Deserialize the payload into type `T` using `serde_json`.
#[cfg(feature = "serde")]
pub fn deserialize<T: serde::de::DeserializeOwned>(self) -> Result<T, serde_json::Error> {
let json = serde_json::to_value(&self.0)?;
serde_json::from_value(json)
}
}

impl From<f64> for Value {
Expand Down
26 changes: 26 additions & 0 deletions src/serde.rs
Original file line number Diff line number Diff line change
Expand Up @@ -196,4 +196,30 @@ mod tests {

eprintln!("payload = {:#?}", payload);
}

#[test]
fn test_ergonomic_deserialize() {
#[derive(Deserialize, Serialize, Eq, PartialEq, Debug)]
struct S {
some_string: String,
some_bool: bool,
some_int: i32,
some_seq: Vec<String>,
some_obj: HashMap<String, String>,
}

let value = S {
some_string: "Bar".into(),
some_bool: true,
some_int: 12,
some_seq: vec!["elem1".into(), "elem2".into()],
some_obj: HashMap::from([("key".into(), "value".into())]),
};

let json_value = serde_json::to_value(&value).unwrap();
let payload: Payload = json_value.try_into().unwrap();
let deserialized_value: S = payload.deserialize().unwrap();

assert_eq!(value, deserialized_value)
}
}

0 comments on commit 5a35bcf

Please sign in to comment.