use chrono::{DateTime, Utc}; use serde::de::{self, Visitor}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use std::fmt; use surrealdb::sql::Thing; struct FlexibleIdVisitor; impl<'de> Visitor<'de> for FlexibleIdVisitor { type Value = String; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a string or a Thing") } fn visit_str(self, value: &str) -> Result where E: de::Error, { Ok(value.to_string()) } fn visit_string(self, value: String) -> Result where E: de::Error, { Ok(value) } fn visit_map(self, map: A) -> Result where A: de::MapAccess<'de>, { let thing = Thing::deserialize(de::value::MapAccessDeserializer::new(map))?; Ok(thing.id.to_raw()) } } pub fn deserialize_flexible_id<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { deserializer.deserialize_any(FlexibleIdVisitor) } pub fn serialize_datetime(date: &DateTime, serializer: S) -> Result where S: Serializer, { Into::::into(*date).serialize(serializer) } pub fn deserialize_datetime<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, { let dt = surrealdb::sql::Datetime::deserialize(deserializer)?; Ok(DateTime::::from(dt)) } pub fn serialize_option_datetime( date: &Option>, serializer: S, ) -> Result where S: Serializer, { match date { Some(dt) => serializer.serialize_some(&Into::::into(*dt)), None => serializer.serialize_none(), } } pub fn deserialize_option_datetime<'de, D>( deserializer: D, ) -> Result>, D::Error> where D: Deserializer<'de>, { let value = Option::::deserialize(deserializer)?; Ok(value.map(DateTime::::from)) }