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}