1#[cfg(feature = "serde")]
4use core::range::Range;
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Deserializer, Serialize, Serializer};
7
8#[cfg(feature = "serde")]
9#[derive(Serialize, Deserialize)]
10struct RangeDef<T> {
11 start: T,
12 end: T,
13}
14
15#[cfg(feature = "serde")]
16#[derive(Serialize)]
17struct RangeDefRef<'a, T> {
18 start: &'a T,
19 end: &'a T,
20}
21
22#[cfg(feature = "serde")]
24pub fn serialize<S, T>(value: &Range<T>, serializer: S) -> Result<S::Ok, S::Error>
25where
26 S: Serializer,
27 T: Serialize,
28{
29 RangeDefRef { start: &value.start, end: &value.end }.serialize(serializer)
30}
31
32#[cfg(feature = "serde")]
34pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Range<T>, D::Error>
35where
36 D: Deserializer<'de>,
37 T: Deserialize<'de>,
38{
39 let def = RangeDef::<T>::deserialize(deserializer)?;
40 Ok(Range { start: def.start, end: def.end })
41}
42
43#[cfg(feature = "serde")]
45pub mod option {
46 use super::{RangeDef, RangeDefRef};
47 use core::range::Range;
48 use serde::{Deserialize, Deserializer, Serialize, Serializer};
49
50 pub fn serialize<S, T>(value: &Option<Range<T>>, serializer: S) -> Result<S::Ok, S::Error>
52 where
53 S: Serializer,
54 T: Serialize,
55 {
56 match value {
57 Some(r) => Some(RangeDefRef { start: &r.start, end: &r.end }).serialize(serializer),
58 None => Option::<RangeDef<T>>::None.serialize(serializer),
59 }
60 }
61
62 pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Option<Range<T>>, D::Error>
64 where
65 D: Deserializer<'de>,
66 T: Deserialize<'de>,
67 {
68 let def = Option::<RangeDef<T>>::deserialize(deserializer)?;
69 Ok(def.map(|d| Range { start: d.start, end: d.end }))
70 }
71}