1use std::marker::PhantomData;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Serialize, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
9#[serde(untagged)]
10pub enum OneOrMany<T> {
11 One(T),
13
14 Many(Vec<T>),
16}
17
18impl<T> Default for OneOrMany<T> {
19 fn default() -> Self {
20 Self::Many(Vec::new())
21 }
22}
23
24impl<T> OneOrMany<T> {
25 pub fn any<F>(&self, f: F) -> bool
26 where
27 F: Fn(&T) -> bool,
28 {
29 match self {
30 Self::One(value) => f(value),
31 Self::Many(values) => values.iter().any(f),
32 }
33 }
34
35 pub fn len(&self) -> usize {
36 match self {
37 Self::One(_) => 1,
38 Self::Many(values) => values.len(),
39 }
40 }
41
42 pub fn is_empty(&self) -> bool {
43 match self {
44 Self::One(_) => false,
45 Self::Many(values) => values.is_empty(),
46 }
47 }
48
49 pub fn contains(&self, x: &T) -> bool
50 where
51 T: PartialEq<T>,
52 {
53 match self {
54 Self::One(value) => x == value,
55 Self::Many(values) => values.contains(x),
56 }
57 }
58
59 pub fn as_slice(&self) -> &[T] {
60 match self {
61 Self::One(t) => std::slice::from_ref(t),
62 Self::Many(l) => l.as_slice(),
63 }
64 }
65
66 pub fn first(&self) -> Option<&T> {
67 match self {
68 Self::One(value) => Some(value),
69 Self::Many(values) => {
70 if !values.is_empty() {
71 Some(&values[0])
72 } else {
73 None
74 }
75 }
76 }
77 }
78
79 pub fn to_single(&self) -> Option<&T> {
80 match self {
81 Self::One(value) => Some(value),
82 Self::Many(values) => {
83 if values.len() == 1 {
84 Some(&values[0])
85 } else {
86 None
87 }
88 }
89 }
90 }
91
92 pub fn to_single_mut(&mut self) -> Option<&mut T> {
93 match self {
94 Self::One(value) => Some(value),
95 Self::Many(values) => {
96 if values.len() == 1 {
97 Some(&mut values[0])
98 } else {
99 None
100 }
101 }
102 }
103 }
104
105 pub fn into_single(self) -> Option<T> {
106 match self {
107 Self::One(value) => Some(value),
108 Self::Many(values) => {
109 let mut it = values.into_iter();
110 let value = it.next()?;
111 if it.next().is_none() {
112 Some(value)
113 } else {
114 None
115 }
116 }
117 }
118 }
119
120 pub fn into_vec(self) -> Vec<T> {
121 match self {
122 Self::One(t) => vec![t],
123 Self::Many(v) => v,
124 }
125 }
126}
127
128impl<T> IntoIterator for OneOrMany<T> {
130 type Item = T;
131 type IntoIter = std::vec::IntoIter<Self::Item>;
132
133 fn into_iter(self) -> Self::IntoIter {
134 match self {
135 Self::One(value) => vec![value].into_iter(),
136 Self::Many(values) => values.into_iter(),
137 }
138 }
139}
140
141impl<'a, T> IntoIterator for &'a OneOrMany<T> {
143 type Item = &'a T;
144 type IntoIter = std::vec::IntoIter<Self::Item>;
145
146 fn into_iter(self) -> Self::IntoIter {
147 match self {
148 OneOrMany::One(value) => vec![value].into_iter(),
149 OneOrMany::Many(values) => values.iter().collect::<Vec<Self::Item>>().into_iter(),
150 }
151 }
152}
153
154impl<'de, T> Deserialize<'de> for OneOrMany<T>
155where
156 T: Deserialize<'de>,
157{
158 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
159 where
160 D: serde::de::Deserializer<'de>,
161 {
162 deserializer.deserialize_any(Visitor(PhantomData))
163 }
164}
165
166struct Visitor<T>(PhantomData<T>);
167
168impl<'de, T> serde::de::Visitor<'de> for Visitor<T>
169where
170 T: Deserialize<'de>,
171{
172 type Value = OneOrMany<T>;
173
174 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
175 write!(formatter, "one or more values")
176 }
177
178 fn visit_unit<E>(self) -> Result<Self::Value, E>
179 where
180 E: serde::de::Error,
181 {
182 T::deserialize(serde::de::value::UnitDeserializer::new()).map(OneOrMany::One)
183 }
184
185 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
186 where
187 E: serde::de::Error,
188 {
189 T::deserialize(serde::de::value::BoolDeserializer::new(v)).map(OneOrMany::One)
190 }
191
192 fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
193 where
194 E: serde::de::Error,
195 {
196 T::deserialize(serde::de::value::U8Deserializer::new(v)).map(OneOrMany::One)
197 }
198
199 fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
200 where
201 E: serde::de::Error,
202 {
203 T::deserialize(serde::de::value::U16Deserializer::new(v)).map(OneOrMany::One)
204 }
205
206 fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
207 where
208 E: serde::de::Error,
209 {
210 T::deserialize(serde::de::value::U32Deserializer::new(v)).map(OneOrMany::One)
211 }
212
213 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
214 where
215 E: serde::de::Error,
216 {
217 T::deserialize(serde::de::value::U64Deserializer::new(v)).map(OneOrMany::One)
218 }
219
220 fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
221 where
222 E: serde::de::Error,
223 {
224 T::deserialize(serde::de::value::U128Deserializer::new(v)).map(OneOrMany::One)
225 }
226
227 fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
228 where
229 E: serde::de::Error,
230 {
231 T::deserialize(serde::de::value::I8Deserializer::new(v)).map(OneOrMany::One)
232 }
233
234 fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
235 where
236 E: serde::de::Error,
237 {
238 T::deserialize(serde::de::value::I16Deserializer::new(v)).map(OneOrMany::One)
239 }
240
241 fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
242 where
243 E: serde::de::Error,
244 {
245 T::deserialize(serde::de::value::I32Deserializer::new(v)).map(OneOrMany::One)
246 }
247
248 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
249 where
250 E: serde::de::Error,
251 {
252 T::deserialize(serde::de::value::I64Deserializer::new(v)).map(OneOrMany::One)
253 }
254
255 fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
256 where
257 E: serde::de::Error,
258 {
259 T::deserialize(serde::de::value::I128Deserializer::new(v)).map(OneOrMany::One)
260 }
261
262 fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
263 where
264 E: serde::de::Error,
265 {
266 T::deserialize(serde::de::value::F32Deserializer::new(v)).map(OneOrMany::One)
267 }
268
269 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
270 where
271 E: serde::de::Error,
272 {
273 T::deserialize(serde::de::value::F64Deserializer::new(v)).map(OneOrMany::One)
274 }
275
276 fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
277 where
278 E: serde::de::Error,
279 {
280 T::deserialize(serde::de::value::CharDeserializer::new(v)).map(OneOrMany::One)
281 }
282
283 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
284 where
285 E: serde::de::Error,
286 {
287 T::deserialize(serde::de::value::BytesDeserializer::new(v)).map(OneOrMany::One)
288 }
289
290 fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
291 where
292 E: serde::de::Error,
293 {
294 T::deserialize(serde::de::value::BorrowedBytesDeserializer::new(v)).map(OneOrMany::One)
295 }
296
297 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
298 where
299 E: serde::de::Error,
300 {
301 T::deserialize(serde::de::value::BytesDeserializer::new(&v)).map(OneOrMany::One)
302 }
303
304 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
305 where
306 E: serde::de::Error,
307 {
308 T::deserialize(serde::de::value::StrDeserializer::new(v)).map(OneOrMany::One)
309 }
310
311 fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
312 where
313 E: serde::de::Error,
314 {
315 T::deserialize(serde::de::value::BorrowedStrDeserializer::new(v)).map(OneOrMany::One)
316 }
317
318 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
319 where
320 E: serde::de::Error,
321 {
322 T::deserialize(serde::de::value::StringDeserializer::new(v)).map(OneOrMany::One)
323 }
324
325 fn visit_none<E>(self) -> Result<Self::Value, E>
326 where
327 E: serde::de::Error,
328 {
329 T::deserialize(NoneDeserializer::<T, E>(PhantomData)).map(OneOrMany::One)
330 }
331
332 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
333 where
334 D: serde::de::Deserializer<'de>,
335 {
336 T::deserialize(SomeDeserializer::<T, D>(deserializer, PhantomData)).map(OneOrMany::One)
337 }
338
339 fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
340 where
341 A: serde::de::MapAccess<'de>,
342 {
343 T::deserialize(serde::de::value::MapAccessDeserializer::new(map)).map(OneOrMany::One)
344 }
345
346 fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
347 where
348 A: serde::de::EnumAccess<'de>,
349 {
350 T::deserialize(serde::de::value::EnumAccessDeserializer::new(data)).map(OneOrMany::One)
351 }
352
353 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
354 where
355 D: serde::de::Deserializer<'de>,
356 {
357 T::deserialize(NewtypeStructDeserializer::<T, D>(deserializer, PhantomData))
358 .map(OneOrMany::One)
359 }
360
361 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
362 where
363 A: serde::de::SeqAccess<'de>,
364 {
365 let mut many = Vec::new();
366
367 while let Some(t) = seq.next_element::<T>()? {
368 many.push(t);
369 }
370
371 Ok(OneOrMany::Many(many))
372 }
373}
374
375struct NoneDeserializer<T, E>(PhantomData<(T, E)>);
376
377impl<'de, T, E> serde::de::Deserializer<'de> for NoneDeserializer<T, E>
378where
379 T: Deserialize<'de>,
380 E: serde::de::Error,
381{
382 type Error = E;
383
384 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
385 where
386 V: serde::de::Visitor<'de>,
387 {
388 visitor.visit_none()
389 }
390
391 serde::forward_to_deserialize_any! {
392 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
393 bytes byte_buf option unit unit_struct newtype_struct seq tuple
394 tuple_struct map struct enum identifier ignored_any
395 }
396}
397
398struct SomeDeserializer<T, D>(D, PhantomData<T>);
399
400impl<'de, T, D> serde::de::Deserializer<'de> for SomeDeserializer<T, D>
401where
402 T: Deserialize<'de>,
403 D: serde::de::Deserializer<'de>,
404{
405 type Error = D::Error;
406
407 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
408 where
409 V: serde::de::Visitor<'de>,
410 {
411 visitor.visit_some(self.0)
412 }
413
414 serde::forward_to_deserialize_any! {
415 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
416 bytes byte_buf option unit unit_struct newtype_struct seq tuple
417 tuple_struct map struct enum identifier ignored_any
418 }
419}
420
421struct NewtypeStructDeserializer<T, D>(D, PhantomData<T>);
422
423impl<'de, T, D> serde::de::Deserializer<'de> for NewtypeStructDeserializer<T, D>
424where
425 T: Deserialize<'de>,
426 D: serde::de::Deserializer<'de>,
427{
428 type Error = D::Error;
429
430 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
431 where
432 V: serde::de::Visitor<'de>,
433 {
434 visitor.visit_newtype_struct(self.0)
435 }
436
437 serde::forward_to_deserialize_any! {
438 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
439 bytes byte_buf option unit unit_struct newtype_struct seq tuple
440 tuple_struct map struct enum identifier ignored_any
441 }
442}
443
444#[derive(Debug, Serialize, Clone, PartialEq, Eq)]
446#[serde(untagged)]
447pub enum OneOrManyRef<'a, T> {
448 One(&'a T),
449 Many(&'a [T]),
450}
451
452impl<'a, T> OneOrManyRef<'a, T> {
453 pub fn from_slice(s: &'a [T]) -> Self {
454 match s {
455 [t] => Self::One(t),
456 _ => Self::Many(s),
457 }
458 }
459
460 pub fn is_empty(&self) -> bool {
461 matches!(self, Self::Many([]))
462 }
463}