use serde::{Deserialize, Deserializer, Serialize, Serializer};
use uuid::Uuid;
use crate::ULID;
impl Serialize for ULID {
fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where
S: Serializer, {
let text = self.to_string();
text.serialize(serializer)
}
}
impl<'de> Deserialize<'de> for ULID {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>, {
let deserialized_str = String::deserialize(deserializer)?;
deserialized_str.parse::<ULID>().map_err(serde::de::Error::custom)
}
}
pub mod ulid_as_u128 {
use super::*;
pub fn serialize<S>(value: &ULID, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer, {
value.0.serialize(serializer)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<ULID, D::Error>
where
D: Deserializer<'de>, {
let deserialized_u128 = u128::deserialize(deserializer)?;
Ok(ULID::from(deserialized_u128))
}
}
#[cfg(all(feature = "uuid", feature = "serde"))]
pub mod ulid_as_uuid {
use super::*;
pub fn serialize<S>(value: &ULID, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer, {
let uuid: Uuid = value.clone().into();
uuid.to_string().serialize(serializer)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<ULID, D::Error>
where
D: Deserializer<'de>, {
let de_string = String::deserialize(deserializer)?;
let de_uuid = Uuid::parse_str(&de_string).map_err(serde::de::Error::custom)?;
Ok(ULID::from(de_uuid))
}
}