1use serde::de::{DeserializeOwned, Visitor};
4use std::fmt::Display;
5use std::{
6 fmt::{self, Write},
7 marker::PhantomData,
8 str::FromStr,
9};
10
11use uuid::Uuid;
12
13pub fn deserialize_optional_field<'de, T, D>(deserializer: D) -> Result<Option<Option<T>>, D::Error>
20where
21 D: serde::Deserializer<'de>,
22 T: serde::Deserialize<'de>,
23{
24 Ok(Some(serde::Deserialize::deserialize(deserializer)?))
25}
26
27pub fn csv_encode_uuids<T: Into<Uuid> + Copy, S>(
32 uuids: &[T],
33 serializer: S,
34) -> Result<S::Ok, S::Error>
35where
36 S: serde::Serializer,
37{
38 let len = uuids.len() * 36 + uuids.len().saturating_sub(1);
43
44 let mut out = String::with_capacity(len);
45 let mut iter = uuids.iter().copied().map(<T as Into<Uuid>>::into);
46 if let Some(item) = iter.next() {
47 write!(&mut out, "{}", item.hyphenated())
48 .expect("`String` call to `write!` shouldn't fail.");
49 }
50
51 for item in iter {
52 write!(&mut out, ",{}", item.hyphenated())
53 .expect("`String` call to `write!` shouldn't fail");
54 }
55
56 serializer.serialize_str(&out)
57}
58
59pub fn csv_encode_i16_indices<T: Into<i16> + Copy, S>(
65 values: &[T],
66 serializer: S,
67) -> Result<S::Ok, S::Error>
68where
69 S: serde::Serializer,
70{
71 let len = values.len() * 5 + values.len().saturating_sub(1);
74
75 let mut out = String::with_capacity(len);
76 let mut iter = values.iter().copied().map(<T as Into<i16>>::into);
77 if let Some(item) = iter.next() {
78 write!(&mut out, "{}", item.to_string())
79 .expect("`String` call to `write!` shouldn't fail.");
80 }
81
82 for item in iter {
83 write!(&mut out, ",{}", item.to_string())
84 .expect("`String` call to `write!` shouldn't fail");
85 }
86
87 serializer.serialize_str(&out)
88}
89
90pub fn from_csv<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
95where
96 D: serde::Deserializer<'de>,
97 T: DeserializeOwned,
98{
99 deserializer.deserialize_str(CSVVecVisitor::<T>::default())
100}
101
102struct CSVVecVisitor<T: DeserializeOwned>(std::marker::PhantomData<T>);
104
105impl<T: DeserializeOwned> Default for CSVVecVisitor<T> {
106 fn default() -> Self {
107 Self(std::marker::PhantomData)
108 }
109}
110
111impl<'de, T: DeserializeOwned> serde::de::Visitor<'de> for CSVVecVisitor<T> {
112 type Value = Vec<T>;
113
114 fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
115 write!(formatter, "a str")
116 }
117
118 fn visit_str<E>(self, s: &str) -> std::result::Result<Self::Value, E>
119 where
120 E: serde::de::Error,
121 {
122 csv::ReaderBuilder::new()
123 .has_headers(false)
124 .from_reader(s.as_bytes())
125 .into_deserialize()
126 .next()
127 .unwrap_or_else(|| Ok(Vec::new()))
128 .map_err(|e| E::custom(format!("could not deserialize sequence value: {:?}", e)))
129 }
130}
131
132pub fn to_csv<T: Display, S>(values: &[T], serializer: S) -> Result<S::Ok, S::Error>
134where
135 S: serde::Serializer,
136{
137 let out = values
138 .iter()
139 .map(std::string::ToString::to_string)
140 .collect::<Vec<String>>()
141 .join(",");
142
143 serializer.serialize_str(&out)
144}
145
146pub(super) struct FromStrVisitor<T>(pub PhantomData<T>);
167
168impl<'de, TErr: std::fmt::Debug, T: FromStr<Err = TErr>> Visitor<'de> for FromStrVisitor<T> {
169 type Value = T;
170
171 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
172 formatter.write_str("string")
173 }
174
175 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
176 where
177 E: serde::de::Error,
178 {
179 FromStr::from_str(value)
180 .map_err(|e| E::custom(format!("could not deserialize string: {:?}", e)))
181 }
182}