serde_columnar/
wrap.rs

1use std::{borrow::Cow, hash::Hash};
2
3use serde::{Deserialize, Serialize};
4
5use crate::row::{KeyRowDe, KeyRowSer, RowDe, RowSer};
6
7/// The wrapper of `Vec-like` container, we have implemented the `Serialize` and `Deserialize` for it.
8///
9/// When it is serialized or deserialized, it will call [`RowSer::serialize_columns()`] or [`RowDe::deserialize_columns()`]
10#[derive(Debug, PartialEq, Clone)]
11pub struct ColumnarVec<'c, T, IT>(pub Cow<'c, IT>)
12where
13    for<'a> &'a IT: IntoIterator<Item = &'a T>,
14    IT: FromIterator<T> + Clone;
15
16impl<'c, T, IT> ColumnarVec<'c, T, IT>
17where
18    IT: FromIterator<T> + Clone,
19    for<'a> &'a IT: IntoIterator<Item = &'a T>,
20{
21    pub fn new(vec: &'c IT) -> Self {
22        Self(Cow::Borrowed(vec))
23    }
24
25    pub fn into_vec(self) -> IT {
26        self.0.into_owned()
27    }
28}
29
30impl<T, IT> From<IT> for ColumnarVec<'_, T, IT>
31where
32    IT: FromIterator<T> + Clone,
33    for<'a> &'a IT: IntoIterator<Item = &'a T>,
34{
35    fn from(vec: IT) -> Self {
36        Self(Cow::Owned(vec))
37    }
38}
39
40impl<'c, T, IT> From<&'c IT> for ColumnarVec<'c, T, IT>
41where
42    IT: FromIterator<T> + Clone,
43    for<'a> &'a IT: IntoIterator<Item = &'a T>,
44{
45    fn from(vec: &'c IT) -> Self {
46        Self(Cow::Borrowed(vec))
47    }
48}
49
50impl<'c, T, IT> Serialize for ColumnarVec<'c, T, IT>
51where
52    T: RowSer<IT>,
53    IT: FromIterator<T> + Clone,
54    for<'a> &'a IT: IntoIterator<Item = &'a T>,
55{
56    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
57    where
58        S: serde::Serializer,
59    {
60        T::serialize_columns(&self.0, serializer)
61    }
62}
63
64impl<'de, 'c, T, IT> Deserialize<'de> for ColumnarVec<'c, T, IT>
65where
66    T: RowDe<'de, IT>,
67    IT: FromIterator<T> + Clone,
68    for<'a> &'a IT: IntoIterator<Item = &'a T>,
69{
70    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
71    where
72        D: serde::Deserializer<'de>,
73    {
74        Ok(ColumnarVec(Cow::Owned(T::deserialize_columns(
75            deserializer,
76        )?)))
77    }
78}
79
80/// The wrapper of `Map-like` container, we have implemented the `Serialize` and `Deserialize` for it.
81///
82/// When it is serialized or deserialized, it will call [`KeyRowSer::serialize_columns()`] or [`KeyRowDe::deserialize_columns()`]
83#[derive(Debug, PartialEq, Clone, Eq)]
84pub struct ColumnarMap<'c, K, T, IT>(pub Cow<'c, IT>)
85where
86    for<'a> &'a IT: IntoIterator<Item = (&'a K, &'a T)>,
87    IT: FromIterator<(K, T)> + Clone,
88    K: Eq + Clone;
89
90impl<'c, K, T, IT> ColumnarMap<'c, K, T, IT>
91where
92    for<'a> &'a IT: IntoIterator<Item = (&'a K, &'a T)>,
93    IT: FromIterator<(K, T)> + Clone,
94    K: Eq + Clone,
95{
96    pub fn new(map: &'c IT) -> Self {
97        Self(Cow::Borrowed(map))
98    }
99
100    pub fn into_map(self) -> IT {
101        self.0.into_owned()
102    }
103}
104
105impl<'c, K, T, IT> Serialize for ColumnarMap<'c, K, T, IT>
106where
107    T: KeyRowSer<K, IT>,
108    for<'a> &'a IT: IntoIterator<Item = (&'a K, &'a T)>,
109    IT: FromIterator<(K, T)> + Clone,
110    K: Serialize + PartialEq + Eq + Hash + Clone,
111{
112    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
113    where
114        S: serde::Serializer,
115    {
116        T::serialize_columns(&self.0, serializer)
117    }
118}
119
120impl<'de, 'c, K, T, IT> Deserialize<'de> for ColumnarMap<'c, K, T, IT>
121where
122    T: KeyRowDe<'de, K, IT>,
123    for<'a> &'a IT: IntoIterator<Item = (&'a K, &'a T)>,
124    IT: FromIterator<(K, T)> + Clone,
125    K: Deserialize<'de> + PartialEq + Eq + Hash + Clone,
126{
127    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
128    where
129        D: serde::Deserializer<'de>,
130    {
131        Ok(ColumnarMap(Cow::Owned(T::deserialize_columns(
132            deserializer,
133        )?)))
134    }
135}
136
137impl<'c, T, IT> Default for ColumnarVec<'c, T, IT>
138where
139    IT: FromIterator<T> + Clone + Default,
140    for<'a> &'a IT: IntoIterator<Item = &'a T>,
141{
142    fn default() -> Self {
143        Self(Default::default())
144    }
145}
146
147impl<'de, 'c, K, T, IT> Default for ColumnarMap<'c, K, T, IT>
148where
149    T: KeyRowDe<'de, K, IT>,
150    for<'a> &'a IT: IntoIterator<Item = (&'a K, &'a T)>,
151    IT: FromIterator<(K, T)> + Clone + Default,
152    K: Deserialize<'de> + PartialEq + Eq + Hash + Clone,
153{
154    fn default() -> Self {
155        Self(Default::default())
156    }
157}