aboutsummaryrefslogtreecommitdiff
path: root/src/serde.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/serde.rs')
-rw-r--r--src/serde.rs164
1 files changed, 87 insertions, 77 deletions
diff --git a/src/serde.rs b/src/serde.rs
index b8e307c..f44ebb3 100644
--- a/src/serde.rs
+++ b/src/serde.rs
@@ -31,54 +31,59 @@ where
}
}
-#[derive(Debug)]
-pub struct LinkedHashMapVisitor<K, V> {
- marker: PhantomData<LinkedHashMap<K, V>>,
-}
-
-impl<K, V> LinkedHashMapVisitor<K, V> {
- fn new() -> Self {
- LinkedHashMapVisitor {
- marker: PhantomData,
- }
- }
-}
-
-impl<K, V> Default for LinkedHashMapVisitor<K, V> {
- fn default() -> Self {
- Self::new()
- }
-}
-
-impl<'de, K, V> Visitor<'de> for LinkedHashMapVisitor<K, V>
+impl<'de, K, V, S> Deserialize<'de> for LinkedHashMap<K, V, S>
where
K: Deserialize<'de> + Eq + Hash,
V: Deserialize<'de>,
+ S: BuildHasher + Default,
{
- type Value = LinkedHashMap<K, V>;
-
- fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
- write!(formatter, "a map")
- }
+ fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
+ #[derive(Debug)]
+ pub struct LinkedHashMapVisitor<K, V, S> {
+ marker: PhantomData<LinkedHashMap<K, V, S>>,
+ }
- #[inline]
- fn visit_map<M: MapAccess<'de>>(self, mut map: M) -> Result<Self::Value, M::Error> {
- let mut values = LinkedHashMap::with_capacity(map.size_hint().unwrap_or(0));
+ impl<K, V, S> LinkedHashMapVisitor<K, V, S> {
+ fn new() -> Self {
+ LinkedHashMapVisitor {
+ marker: PhantomData,
+ }
+ }
+ }
- while let Some((k, v)) = map.next_entry()? {
- values.insert(k, v);
+ impl<K, V, S> Default for LinkedHashMapVisitor<K, V, S> {
+ fn default() -> Self {
+ Self::new()
+ }
}
- Ok(values)
- }
-}
+ impl<'de, K, V, S> Visitor<'de> for LinkedHashMapVisitor<K, V, S>
+ where
+ K: Deserialize<'de> + Eq + Hash,
+ V: Deserialize<'de>,
+ S: BuildHasher + Default,
+ {
+ type Value = LinkedHashMap<K, V, S>;
+
+ fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
+ write!(formatter, "a map")
+ }
+
+ #[inline]
+ fn visit_map<M: MapAccess<'de>>(self, mut map: M) -> Result<Self::Value, M::Error> {
+ let mut values = LinkedHashMap::with_capacity_and_hasher(
+ map.size_hint().unwrap_or(0),
+ S::default(),
+ );
+
+ while let Some((k, v)) = map.next_entry()? {
+ values.insert(k, v);
+ }
+
+ Ok(values)
+ }
+ }
-impl<'de, K, V> Deserialize<'de> for LinkedHashMap<K, V>
-where
- K: Deserialize<'de> + Eq + Hash,
- V: Deserialize<'de>,
-{
- fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
deserializer.deserialize_map(LinkedHashMapVisitor::default())
}
}
@@ -100,52 +105,57 @@ where
}
}
-#[derive(Debug)]
-pub struct LinkedHashSetVisitor<T> {
- marker: PhantomData<LinkedHashSet<T>>,
-}
-
-impl<T> LinkedHashSetVisitor<T> {
- fn new() -> Self {
- LinkedHashSetVisitor {
- marker: PhantomData,
- }
- }
-}
-
-impl<T> Default for LinkedHashSetVisitor<T> {
- fn default() -> Self {
- Self::new()
- }
-}
-
-impl<'de, T> Visitor<'de> for LinkedHashSetVisitor<T>
+impl<'de, T, S> Deserialize<'de> for LinkedHashSet<T, S>
where
T: Deserialize<'de> + Eq + Hash,
+ S: BuildHasher + Default,
{
- type Value = LinkedHashSet<T>;
-
- fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
- write!(formatter, "a sequence")
- }
+ fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
+ #[derive(Debug)]
+ pub struct LinkedHashSetVisitor<T, S> {
+ marker: PhantomData<LinkedHashSet<T, S>>,
+ }
- #[inline]
- fn visit_seq<S: SeqAccess<'de>>(self, mut seq: S) -> Result<Self::Value, S::Error> {
- let mut values = LinkedHashSet::with_capacity(seq.size_hint().unwrap_or(0));
+ impl<T, S> LinkedHashSetVisitor<T, S> {
+ fn new() -> Self {
+ LinkedHashSetVisitor {
+ marker: PhantomData,
+ }
+ }
+ }
- while let Some(v) = seq.next_element()? {
- values.insert(v);
+ impl<T, S> Default for LinkedHashSetVisitor<T, S> {
+ fn default() -> Self {
+ Self::new()
+ }
}
- Ok(values)
- }
-}
+ impl<'de, T, S> Visitor<'de> for LinkedHashSetVisitor<T, S>
+ where
+ T: Deserialize<'de> + Eq + Hash,
+ S: BuildHasher + Default,
+ {
+ type Value = LinkedHashSet<T, S>;
+
+ fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
+ write!(formatter, "a sequence")
+ }
+
+ #[inline]
+ fn visit_seq<SA: SeqAccess<'de>>(self, mut seq: SA) -> Result<Self::Value, SA::Error> {
+ let mut values = LinkedHashSet::with_capacity_and_hasher(
+ seq.size_hint().unwrap_or(0),
+ S::default(),
+ );
+
+ while let Some(v) = seq.next_element()? {
+ values.insert(v);
+ }
+
+ Ok(values)
+ }
+ }
-impl<'de, T> Deserialize<'de> for LinkedHashSet<T>
-where
- T: Deserialize<'de> + Eq + Hash,
-{
- fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
deserializer.deserialize_seq(LinkedHashSetVisitor::default())
}
}