Skip to content

Commit 11e4f1e

Browse files
authored
Merge pull request #370 from fililip/main
Implement #367
2 parents 73029ac + 429752a commit 11e4f1e

File tree

2 files changed

+57
-2
lines changed

2 files changed

+57
-2
lines changed

src/de.rs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{
2-
binary_heap::Kind as BinaryHeapKind, BinaryHeap, IndexMap, IndexSet, LinearMap, String, Vec,
2+
binary_heap::Kind as BinaryHeapKind, BinaryHeap, Deque, IndexMap, IndexSet, LinearMap, String, Vec,
33
};
44
use core::{
55
fmt,
@@ -133,6 +133,45 @@ where
133133
}
134134
}
135135

136+
impl<'de, T, const N: usize> Deserialize<'de> for Deque<T, N>
137+
where
138+
T: Deserialize<'de>,
139+
{
140+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
141+
where
142+
D: Deserializer<'de>,
143+
{
144+
struct ValueVisitor<'de, T, const N: usize>(PhantomData<(&'de (), T)>);
145+
146+
impl<'de, T, const N: usize> serde::de::Visitor<'de> for ValueVisitor<'de, T, N>
147+
where
148+
T: Deserialize<'de>,
149+
{
150+
type Value = Deque<T, N>;
151+
152+
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
153+
formatter.write_str("a sequence")
154+
}
155+
156+
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
157+
where
158+
A: SeqAccess<'de>,
159+
{
160+
let mut values = Deque::new();
161+
162+
while let Some(value) = seq.next_element()? {
163+
if values.push_back(value).is_err() {
164+
return Err(A::Error::invalid_length(values.capacity() + 1, &self))?;
165+
}
166+
}
167+
168+
Ok(values)
169+
}
170+
}
171+
deserializer.deserialize_seq(ValueVisitor(PhantomData))
172+
}
173+
}
174+
136175
// Dictionaries
137176

138177
impl<'de, K, V, S, const N: usize> Deserialize<'de> for IndexMap<K, V, BuildHasherDefault<S>, N>

src/ser.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use core::hash::{BuildHasher, Hash};
22

33
use crate::{
4-
binary_heap::Kind as BinaryHeapKind, BinaryHeap, IndexMap, IndexSet, LinearMap, String, Vec,
4+
binary_heap::Kind as BinaryHeapKind, BinaryHeap, Deque, IndexMap, IndexSet, LinearMap, String, Vec,
55
};
66
use serde::ser::{Serialize, SerializeMap, SerializeSeq, Serializer};
77

@@ -57,6 +57,22 @@ where
5757
}
5858
}
5959

60+
impl<T, const N: usize> Serialize for Deque<T, N>
61+
where
62+
T: Serialize,
63+
{
64+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
65+
where
66+
S: Serializer,
67+
{
68+
let mut seq = serializer.serialize_seq(Some(self.len()))?;
69+
for element in self {
70+
seq.serialize_element(element)?;
71+
}
72+
seq.end()
73+
}
74+
}
75+
6076
// Dictionaries
6177

6278
impl<K, V, S, const N: usize> Serialize for IndexMap<K, V, S, N>

0 commit comments

Comments
 (0)