micromegas_transit/
uuid_utils.rs

1use serde::Deserialize;
2use serde::de::Error;
3use uuid::Uuid;
4
5/// Deserializes a UUID from a string using serde
6pub fn uuid_from_string<'de, D>(deserializer: D) -> Result<Uuid, D::Error>
7where
8    D: serde::Deserializer<'de>,
9{
10    let s: String = Deserialize::deserialize(deserializer)?;
11    Uuid::parse_str(&s).map_err(D::Error::custom)
12}
13
14/// Deserializes an optional UUID from a string using serde, returning None for empty strings
15pub fn opt_uuid_from_string<'de, D>(deserializer: D) -> Result<Option<Uuid>, D::Error>
16where
17    D: serde::Deserializer<'de>,
18{
19    let opt_s: Option<String> = Deserialize::deserialize(deserializer)?;
20    if let Some(s) = opt_s {
21        if s.is_empty() {
22            Ok(None)
23        } else {
24            Uuid::parse_str(&s).map(Some).map_err(D::Error::custom)
25        }
26    } else {
27        Ok(None)
28    }
29}
30
31/// Serializes a UUID to a string using serde
32pub fn uuid_to_string<S>(value: &uuid::Uuid, serializer: S) -> Result<S::Ok, S::Error>
33where
34    S: serde::Serializer,
35{
36    serializer.serialize_str(&value.to_string())
37}
38
39/// Serializes an optional UUID to a string using serde, using empty string for None
40pub fn opt_uuid_to_string<S>(value: &Option<uuid::Uuid>, serializer: S) -> Result<S::Ok, S::Error>
41where
42    S: serde::Serializer,
43{
44    if let Some(v) = value {
45        serializer.serialize_str(&v.to_string())
46    } else {
47        serializer.serialize_str("")
48    }
49}
50
51/// Parse an optional UUID from a string, returning None if the string is empty
52pub fn parse_optional_uuid(s: &str) -> Result<Option<Uuid>, uuid::Error> {
53    if s.is_empty() {
54        Ok(None)
55    } else {
56        Uuid::parse_str(s).map(Some)
57    }
58}