1use std::collections::{BTreeMap, HashMap};
2
3use serde::{
4 ser::{SerializeMap, SerializeSeq},
5 Serialize,
6};
7
8pub struct Seeded<'a, Q, T> {
13 pub seed: &'a Q,
14 pub value: T,
15}
16
17impl<'a, Q, T> Seeded<'a, Q, T> {
18 pub fn new(seed: &'a Q, value: T) -> Self {
20 Self { seed, value }
21 }
22}
23
24impl<Q, T: Clone> Clone for Seeded<'_, Q, T> {
25 fn clone(&self) -> Self {
26 Self {
27 seed: self.seed,
28 value: self.value.clone(),
29 }
30 }
31}
32
33impl<Q, T: Copy> Copy for Seeded<'_, Q, T> {}
34
35impl<Q, T> Serialize for Seeded<'_, Q, T>
36where
37 T: SerializeSeeded<Q>,
38{
39 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
40 where
41 S: serde::Serializer,
42 {
43 self.value.serialize_seeded(self.seed, serializer)
44 }
45}
46
47pub trait SerializeSeeded<Q> {
49 fn serialize_seeded<S>(&self, seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
51 where
52 S: serde::Serializer;
53}
54
55impl<Q, T> SerializeSeeded<Q> for &T
56where
57 T: SerializeSeeded<Q>,
58{
59 fn serialize_seeded<S>(&self, seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
60 where
61 S: serde::Serializer,
62 {
63 T::serialize_seeded(*self, seed, serializer)
64 }
65}
66
67impl<Q, T> SerializeSeeded<Q> for Box<T>
68where
69 T: SerializeSeeded<Q>,
70{
71 fn serialize_seeded<S>(&self, seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
72 where
73 S: serde::Serializer,
74 {
75 T::serialize_seeded(self, seed, serializer)
76 }
77}
78
79impl<Q> SerializeSeeded<Q> for () {
80 fn serialize_seeded<S>(&self, _seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
81 where
82 S: serde::Serializer,
83 {
84 serde::Serialize::serialize(self, serializer)
85 }
86}
87
88impl<Q> SerializeSeeded<Q> for bool {
89 fn serialize_seeded<S>(&self, _seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
90 where
91 S: serde::Serializer,
92 {
93 serde::Serialize::serialize(self, serializer)
94 }
95}
96
97impl<Q> SerializeSeeded<Q> for u32 {
98 fn serialize_seeded<S>(&self, _seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
99 where
100 S: serde::Serializer,
101 {
102 serde::Serialize::serialize(self, serializer)
103 }
104}
105
106impl<Q> SerializeSeeded<Q> for str {
107 fn serialize_seeded<S>(&self, _seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
108 where
109 S: serde::Serializer,
110 {
111 serde::Serialize::serialize(self, serializer)
112 }
113}
114
115impl<Q> SerializeSeeded<Q> for String {
116 fn serialize_seeded<S>(&self, _seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
117 where
118 S: serde::Serializer,
119 {
120 serde::Serialize::serialize(self, serializer)
121 }
122}
123
124impl<Q, T> SerializeSeeded<Q> for Option<T>
125where
126 T: SerializeSeeded<Q>,
127{
128 fn serialize_seeded<S>(&self, seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
129 where
130 S: serde::Serializer,
131 {
132 match self {
133 Some(t) => serializer.serialize_some(&Seeded::new(seed, t)),
134 None => serializer.serialize_none(),
135 }
136 }
137}
138
139impl<Q, T> SerializeSeeded<Q> for [T]
140where
141 T: SerializeSeeded<Q>,
142{
143 fn serialize_seeded<S>(&self, seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
144 where
145 S: serde::Serializer,
146 {
147 let mut s = serializer.serialize_seq(Some(self.len()))?;
148
149 for item in self {
150 s.serialize_element(&Seeded::new(seed, item))?;
151 }
152
153 s.end()
154 }
155}
156
157impl<Q, T> SerializeSeeded<Q> for Vec<T>
158where
159 T: SerializeSeeded<Q>,
160{
161 fn serialize_seeded<S>(&self, seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
162 where
163 S: serde::Serializer,
164 {
165 let mut s = serializer.serialize_seq(Some(self.len()))?;
166
167 for item in self {
168 s.serialize_element(&Seeded::new(seed, item))?;
169 }
170
171 s.end()
172 }
173}
174
175impl<Q, K, V> SerializeSeeded<Q> for BTreeMap<K, V>
176where
177 K: SerializeSeeded<Q>,
178 V: SerializeSeeded<Q>,
179{
180 fn serialize_seeded<S>(&self, seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
181 where
182 S: serde::Serializer,
183 {
184 let mut map = serializer.serialize_map(Some(self.len()))?;
185 for (key, value) in self {
186 map.serialize_entry(&Seeded::new(seed, key), &Seeded::new(seed, value))?;
187 }
188 map.end()
189 }
190}
191
192impl<Q, K, V> SerializeSeeded<Q> for HashMap<K, V>
193where
194 K: SerializeSeeded<Q>,
195 V: SerializeSeeded<Q>,
196{
197 fn serialize_seeded<S>(&self, seed: &Q, serializer: S) -> Result<S::Ok, S::Error>
198 where
199 S: serde::Serializer,
200 {
201 let mut map = serializer.serialize_map(Some(self.len()))?;
202 for (key, value) in self {
203 map.serialize_entry(&Seeded::new(seed, key), &Seeded::new(seed, value))?;
204 }
205 map.end()
206 }
207}