I have to serialize / deserialize data with serde which cannot be handled by the default routines. As such I tried to implement the Serialize and Deserialize for the data structure. While I got it working for serialize (not sure if it is the correct way), I fail to find a solution for deserialize.
#[macro_use]
extern crate serde_derive;
extern crate serde;
extern crate serde_json;
use serde::de::{Deserialize, Deserializer};
use serde::ser::{Serialize, Serializer};
pub static ELEMENT_KEY: &'static str = "element-6066-11e4-a52e-4f735466cecf";
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct WebElement {
#[serde(rename="element-6066-11e4-a52e-4f735466cecf")]
pub id: String
}
#[derive(Debug, PartialEq)]
pub enum PointerOrigin {
Viewport,
Pointer,
Element(WebElement),
}
impl Serialize for PointerOrigin {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer
{
match *self {
PointerOrigin::Pointer => serializer.serialize_str("pointer"),
PointerOrigin::Viewport => serializer.serialize_str("viewport"),
PointerOrigin::Element(ref element) => {
serde::Serialize::serialize(element, serializer)
}
}
}
}
impl<'de> Deserialize<'de> for PointerOrigin {
fn deserialize<D>(deserializer: D) -> Result<PointerOrigin, D::Error>
where D: Deserializer<'de>
{
// ?
}
}
fn main() {
let pointer = PointerOrigin::Element(WebElement { id: "elem".into() });
let serialized = serde_json::to_string(&pointer).unwrap();
// Prints serialized = {"element-6066-11e4-a52e-4f735466cecf":"elem"}
println!("serialized = {}", serialized);
// Convert the JSON string back to a PointerOrigin.
let deserialized: PointerOrigin = serde_json::from_str(&serialized).unwrap();
// Prints deserialized
println!("deserialized = {:?}", deserialized);
}
Could anyone please advise in how the deserializer has to be implemented?