serde_seeded/
ser.rs

1use std::collections::{BTreeMap, HashMap};
2
3use serde::{
4	ser::{SerializeMap, SerializeSeq},
5	Serialize,
6};
7
8/// Seeded value, ready to be serialized.
9///
10/// This type implemented [`Serialize`] when `T` implements
11/// [`SerializeSeeded<Q>`].
12pub 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	/// Creates a new seeded value.
19	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
47/// A data structure that can be serialized with a seed of type `Q`.
48pub trait SerializeSeeded<Q> {
49	/// Serializes the value using the given seed and serializer.
50	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}