/rust/registry/src/index.crates.io-1949cf8c6b5b557f/ulid-1.2.1/src/serde.rs
Line | Count | Source |
1 | | //! Serialization and deserialization. |
2 | | //! |
3 | | //! By default, serialization and deserialization go through ULID's 26-character |
4 | | //! canonical string representation as set by the ULID standard. |
5 | | //! |
6 | | //! ULIDs can optionally be serialized as u128 integers using the `ulid_as_u128` |
7 | | //! module. See the module's documentation for examples. |
8 | | |
9 | | use crate::{Ulid, ULID_LEN}; |
10 | | use serde::{Deserialize, Deserializer, Serialize, Serializer}; |
11 | | |
12 | | impl Serialize for Ulid { |
13 | 0 | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
14 | 0 | where |
15 | 0 | S: Serializer, |
16 | | { |
17 | 0 | let mut buffer = [0; ULID_LEN]; |
18 | 0 | let text = self.array_to_str(&mut buffer); |
19 | 0 | text.serialize(serializer) |
20 | 0 | } |
21 | | } |
22 | | |
23 | | impl<'de> Deserialize<'de> for Ulid { |
24 | 0 | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
25 | 0 | where |
26 | 0 | D: Deserializer<'de>, |
27 | | { |
28 | 0 | let deserialized_str = String::deserialize(deserializer)?; |
29 | 0 | Self::from_string(&deserialized_str).map_err(serde::de::Error::custom) |
30 | 0 | } |
31 | | } |
32 | | |
33 | | /// Serialization and deserialization of ULIDs through their inner u128 type. |
34 | | /// |
35 | | /// To use it, annotate a field with |
36 | | /// `#[serde(with = "ulid_as_u128")]`, |
37 | | /// `#[serde(serialize_with = "ulid_as_u128")]`, or |
38 | | /// `#[serde(deserialize_with = "ulid_as_u128")]`. |
39 | | /// |
40 | | /// # Examples |
41 | | /// ``` |
42 | | /// # use ulid::Ulid; |
43 | | /// # use ulid::serde::ulid_as_u128; |
44 | | /// # use serde_derive::{Serialize, Deserialize}; |
45 | | /// #[derive(Serialize, Deserialize)] |
46 | | /// struct U128Example { |
47 | | /// #[serde(with = "ulid_as_u128")] |
48 | | /// identifier: Ulid |
49 | | /// } |
50 | | /// ``` |
51 | | pub mod ulid_as_u128 { |
52 | | use crate::Ulid; |
53 | | use serde::{Deserialize, Deserializer, Serialize, Serializer}; |
54 | | |
55 | | /// Serializes a ULID as a u128 type. |
56 | 0 | pub fn serialize<S>(value: &Ulid, serializer: S) -> Result<S::Ok, S::Error> |
57 | 0 | where |
58 | 0 | S: Serializer, |
59 | | { |
60 | 0 | value.0.serialize(serializer) |
61 | 0 | } |
62 | | |
63 | | /// Deserializes a ULID from a u128 type. |
64 | 0 | pub fn deserialize<'de, D>(deserializer: D) -> Result<Ulid, D::Error> |
65 | 0 | where |
66 | 0 | D: Deserializer<'de>, |
67 | | { |
68 | 0 | let deserialized_u128 = u128::deserialize(deserializer)?; |
69 | 0 | Ok(Ulid(deserialized_u128)) |
70 | 0 | } |
71 | | } |
72 | | |
73 | | /// Serialization and deserialization of ULIDs through UUID strings. |
74 | | /// |
75 | | /// To use this module, annotate a field with |
76 | | /// `#[serde(with = "ulid_as_uuid")]`, |
77 | | /// `#[serde(serialize_with = "ulid_as_uuid")]`, or |
78 | | /// `#[serde(deserialize_with = "ulid_as_uuid")]`. |
79 | | /// |
80 | | /// # Examples |
81 | | /// ``` |
82 | | /// # use ulid::Ulid; |
83 | | /// # use ulid::serde::ulid_as_uuid; |
84 | | /// # use serde_derive::{Serialize, Deserialize}; |
85 | | /// #[derive(Serialize, Deserialize)] |
86 | | /// struct UuidExample { |
87 | | /// #[serde(with = "ulid_as_uuid")] |
88 | | /// identifier: Ulid |
89 | | /// } |
90 | | /// ``` |
91 | | #[cfg(all(feature = "uuid", feature = "serde"))] |
92 | | pub mod ulid_as_uuid { |
93 | | use crate::Ulid; |
94 | | use serde::{Deserialize, Deserializer, Serialize, Serializer}; |
95 | | use uuid::Uuid; |
96 | | |
97 | | /// Converts the ULID to a UUID and serializes it as a string. |
98 | | pub fn serialize<S>(value: &Ulid, serializer: S) -> Result<S::Ok, S::Error> |
99 | | where |
100 | | S: Serializer, |
101 | | { |
102 | | let uuid: Uuid = (*value).into(); |
103 | | uuid.to_string().serialize(serializer) |
104 | | } |
105 | | |
106 | | /// Deserializes a ULID from a string containing a UUID. |
107 | | pub fn deserialize<'de, D>(deserializer: D) -> Result<Ulid, D::Error> |
108 | | where |
109 | | D: Deserializer<'de>, |
110 | | { |
111 | | let de_string = String::deserialize(deserializer)?; |
112 | | let de_uuid = Uuid::parse_str(&de_string).map_err(serde::de::Error::custom)?; |
113 | | Ok(Ulid::from(de_uuid)) |
114 | | } |
115 | | } |