1#[cfg(feature = "derive")]
13pub use serde_seeded_derive::{DeserializeSeeded, SerializeSeeded};
14
15pub mod ser;
16pub use ser::SerializeSeeded;
17
18pub mod de;
19pub use de::DeserializeSeeded;
20
21pub mod unseeded {
22 use serde::{Deserialize, Deserializer, Serialize, Serializer};
23
24 pub fn serialize_seeded<T, Q, S>(value: &T, _seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
25 where
26 T: Serialize,
27 S: Serializer,
28 {
29 value.serialize(serializer)
30 }
31
32 pub fn deserialize_seeded<'de, T, Q, D>(_seed: &Q, deserializer: D) -> Result<T, D::Error>
33 where
34 T: Deserialize<'de>,
35 D: Deserializer<'de>,
36 {
37 T::deserialize(deserializer)
38 }
39}
40
41pub mod unseeded_btreemap_key {
42 use crate::{de::Seed, ser::Seeded, DeserializeSeeded, SerializeSeeded};
43 use serde::{ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer};
44 use std::{collections::BTreeMap, marker::PhantomData};
45
46 pub fn serialize_seeded<K, V, Q, S>(
47 value: &BTreeMap<K, V>,
48 seed: &Q,
49 serializer: S,
50 ) -> Result<S::Ok, S::Error>
51 where
52 K: Serialize,
53 V: SerializeSeeded<Q>,
54 S: Serializer,
55 {
56 let mut s = serializer.serialize_map(Some(value.len()))?;
57
58 for (key, value) in value {
59 s.serialize_entry(key, &Seeded::new(seed, value))?;
60 }
61
62 s.end()
63 }
64
65 pub fn deserialize_seeded<'de, K, V, Q, D>(
66 seed: &Q,
67 deserializer: D,
68 ) -> Result<BTreeMap<K, V>, D::Error>
69 where
70 K: Ord + Deserialize<'de>,
71 V: DeserializeSeeded<'de, Q>,
72 D: Deserializer<'de>,
73 {
74 struct Visitor<'seed, Q, K, V>(&'seed Q, PhantomData<BTreeMap<K, V>>);
75
76 impl<'de, Q, K, V> ::serde::de::Visitor<'de> for Visitor<'_, Q, K, V>
77 where
78 K: Ord + Deserialize<'de>,
79 V: DeserializeSeeded<'de, Q>,
80 {
81 type Value = BTreeMap<K, V>;
82
83 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
84 write!(formatter, "a map")
85 }
86
87 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
88 where
89 A: serde::de::MapAccess<'de>,
90 {
91 let mut result = BTreeMap::new();
92
93 while let Some(key) = map.next_key()? {
94 let value = map.next_value_seed(Seed::new(self.0))?;
95 result.insert(key, value);
96 }
97
98 Ok(result)
99 }
100 }
101
102 deserializer.deserialize_map(Visitor(seed, PhantomData))
103 }
104}
105
106pub mod unseeded_hashmap_key {
107 use crate::{de::Seed, ser::Seeded, DeserializeSeeded, SerializeSeeded};
108 use serde::{ser::SerializeMap, Deserialize, Deserializer, Serialize, Serializer};
109 use std::{collections::HashMap, hash::Hash, marker::PhantomData};
110
111 pub fn serialize_seeded<K, V, Q, S>(
112 value: &HashMap<K, V>,
113 seed: &Q,
114 serializer: S,
115 ) -> Result<S::Ok, S::Error>
116 where
117 K: Serialize,
118 V: SerializeSeeded<Q>,
119 S: Serializer,
120 {
121 let mut s = serializer.serialize_map(Some(value.len()))?;
122
123 for (key, value) in value {
124 s.serialize_entry(key, &Seeded::new(seed, value))?;
125 }
126
127 s.end()
128 }
129
130 pub fn deserialize_seeded<'de, K, V, Q, D>(
131 seed: &Q,
132 deserializer: D,
133 ) -> Result<HashMap<K, V>, D::Error>
134 where
135 K: Eq + Hash + Deserialize<'de>,
136 V: DeserializeSeeded<'de, Q>,
137 D: Deserializer<'de>,
138 {
139 struct Visitor<'seed, Q, K, V>(&'seed Q, PhantomData<HashMap<K, V>>);
140
141 impl<'de, Q, K, V> ::serde::de::Visitor<'de> for Visitor<'_, Q, K, V>
142 where
143 K: Eq + Hash + Deserialize<'de>,
144 V: DeserializeSeeded<'de, Q>,
145 {
146 type Value = HashMap<K, V>;
147
148 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
149 write!(formatter, "a map")
150 }
151
152 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
153 where
154 A: serde::de::MapAccess<'de>,
155 {
156 let mut result = HashMap::new();
157
158 while let Some(key) = map.next_key()? {
159 let value = map.next_value_seed(Seed::new(self.0))?;
160 result.insert(key, value);
161 }
162
163 Ok(result)
164 }
165 }
166
167 deserializer.deserialize_map(Visitor(seed, PhantomData))
168 }
169}