Skip to content

Instantly share code, notes, and snippets.

@sebastinez
Created September 19, 2022 09:01
Show Gist options
  • Save sebastinez/f1c351a4af19cdf74c405fadcf0358e7 to your computer and use it in GitHub Desktop.
Save sebastinez/f1c351a4af19cdf74c405fadcf0358e7 to your computer and use it in GitHub Desktop.
Not able to deserialize time
use serde::{de::Visitor, Deserialize, Deserializer, Serialize, Serializer};
use std::fmt;
#[derive(Serialize, Deserialize, Debug)]
struct Author {
name: String,
email: String,
#[serde(
serialize_with = "serialize_time",
deserialize_with = "deserialize_time"
)]
time: git2::Time,
}
fn main() {
let author = Author {
name: String::from("Sebastian"),
email: String::from("me@sebastinez.dev"),
time: git2::Time::new(9223372036, 0),
};
let json = serde_json::to_string(&author).unwrap();
let _: Author =
serde_json::from_str(&json).expect("This should be deserialized into an Author struct");
}
fn deserialize_time<'de, D>(deserializer: D) -> Result<git2::Time, D::Error>
where
D: Deserializer<'de>,
{
struct TimeVisitor;
impl<'de> Visitor<'de> for TimeVisitor {
type Value = git2::Time;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a UNIX timestamp in seconds")
}
fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(git2::Time::new(v, 0))
}
}
deserializer.deserialize_identifier(TimeVisitor)
}
fn serialize_time<S>(t: &git2::Time, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_i64(t.seconds())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment