Skip to main content

mr_ulid/
serde.rs

1use std::fmt;
2
3use serde::{
4    Deserialize, Serialize, Serializer,
5    de::{self, Deserializer, Visitor},
6};
7
8use crate::{Ulid, ZeroableUlid, base32};
9
10impl Serialize for ZeroableUlid {
11    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
12    where
13        S: Serializer,
14    {
15        let mut buffer = [0; 26];
16        serializer.serialize_str(base32::encode(self.to_u128(), &mut buffer))
17    }
18}
19
20impl Serialize for Ulid {
21    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
22    where
23        S: Serializer,
24    {
25        let mut buffer = [0; 26];
26        serializer.serialize_str(base32::encode(self.to_u128(), &mut buffer))
27    }
28}
29
30impl<'de> Deserialize<'de> for ZeroableUlid {
31    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
32    where
33        D: Deserializer<'de>,
34    {
35        struct ZeroableVisitor;
36
37        impl Visitor<'_> for ZeroableVisitor {
38            type Value = ZeroableUlid;
39            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
40                formatter.write_str("a valid ULID string")
41            }
42            fn visit_str<E: de::Error>(self, value: &str) -> Result<Self::Value, E> {
43                value.parse().map_err(de::Error::custom)
44            }
45        }
46
47        deserializer.deserialize_str(ZeroableVisitor)
48    }
49}
50
51impl<'de> Deserialize<'de> for Ulid {
52    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
53    where
54        D: Deserializer<'de>,
55    {
56        struct NonZeroVisitor;
57
58        impl Visitor<'_> for NonZeroVisitor {
59            type Value = Ulid;
60            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
61                formatter.write_str("a valid ULID string that is not all zeros")
62            }
63            fn visit_str<E: de::Error>(self, value: &str) -> Result<Self::Value, E> {
64                value.parse().map_err(de::Error::custom)
65            }
66        }
67
68        deserializer.deserialize_str(NonZeroVisitor)
69    }
70}