feanor_math/
serialization.rs1use serde::de::*;
2use serde::{Deserializer, Serialize, Serializer};
3
4use crate::ring::*;
5
6#[stability::unstable(feature = "enable")]
14pub trait SerializableElementRing: RingBase {
15
16 fn deserialize<'de, D>(&self, deserializer: D) -> Result<Self::Element, D::Error>
20 where D: Deserializer<'de>;
21
22 fn serialize<S>(&self, el: &Self::Element, serializer: S) -> Result<S::Ok, S::Error>
26 where S: Serializer;
27}
28
29#[stability::unstable(feature = "enable")]
34#[derive(Clone)]
35pub struct DeserializeWithRing<R: RingStore>
36 where R::Type: SerializableElementRing
37{
38 ring: R
39}
40
41impl<R> DeserializeWithRing<R>
42 where R::Type: SerializableElementRing,
43 R: RingStore
44{
45 #[stability::unstable(feature = "enable")]
46 pub fn new(ring: R) -> Self {
47 Self { ring }
48 }
49}
50
51impl<'de, R> DeserializeSeed<'de> for DeserializeWithRing<R>
52 where R::Type: SerializableElementRing,
53 R: RingStore
54{
55 type Value = El<R>;
56
57 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
58 where D: Deserializer<'de>
59 {
60 self.ring.get_ring().deserialize(deserializer)
61 }
62}
63
64#[stability::unstable(feature = "enable")]
69pub struct SerializeWithRing<'a, R: RingStore>
70 where R::Type: SerializableElementRing
71{
72 ring: R,
73 el: &'a El<R>
74}
75
76impl<'a, R: RingStore> SerializeWithRing<'a, R>
77 where R::Type: SerializableElementRing
78{
79 #[stability::unstable(feature = "enable")]
80 pub fn new(el: &'a El<R>, ring: R) -> Self {
81 Self { el, ring }
82 }
83}
84
85impl<'a, R: RingStore> Serialize for SerializeWithRing<'a, R>
86 where R::Type: SerializableElementRing
87{
88 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
89 where S: Serializer
90 {
91 self.ring.get_ring().serialize(self.el, serializer)
92 }
93}
94
95#[stability::unstable(feature = "enable")]
100pub struct SerializeOwnedWithRing<R: RingStore>
101 where R::Type: SerializableElementRing
102{
103 ring: R,
104 el: El<R>
105}
106
107impl<R: RingStore> SerializeOwnedWithRing<R>
108 where R::Type: SerializableElementRing
109{
110 #[stability::unstable(feature = "enable")]
111 pub fn new(el: El<R>, ring: R) -> Self {
112 Self { el, ring }
113 }
114}
115
116impl<R: RingStore> Serialize for SerializeOwnedWithRing<R>
117 where R::Type: SerializableElementRing
118{
119 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
120 where S: Serializer
121 {
122 self.ring.get_ring().serialize(&self.el, serializer)
123 }
124}
125
126#[stability::unstable(feature = "enable")]
127#[cfg(any(test, feature = "generic_tests"))]
128pub mod generic_tests {
129
130 use super::*;
131
132 #[stability::unstable(feature = "enable")]
133 pub fn test_serialization<R: RingStore, I: Iterator<Item = El<R>>>(ring: R, edge_case_elements: I)
134 where R::Type: SerializableElementRing
135 {
136 let edge_case_elements = edge_case_elements.collect::<Vec<_>>();
137
138 let serializer = serde_assert::Serializer::builder().is_human_readable(true).build();
139 for x in &edge_case_elements {
140 let tokens = ring.get_ring().serialize(&x, &serializer).unwrap();
141 let mut deserializer = serde_assert::Deserializer::builder(tokens).is_human_readable(true).build();
142 let result = ring.get_ring().deserialize(&mut deserializer).unwrap();
143 assert_el_eq!(ring, &result, &x);
144 }
145
146 let serializer = serde_assert::Serializer::builder().is_human_readable(false).build();
147 for x in &edge_case_elements {
148 let tokens = ring.get_ring().serialize(&x, &serializer).unwrap();
149 let mut deserializer = serde_assert::Deserializer::builder(tokens).is_human_readable(false).build();
150 let result = ring.get_ring().deserialize(&mut deserializer).unwrap();
151 assert_el_eq!(ring, &result, &x);
152 }
153 }
154
155 #[stability::unstable(feature = "enable")]
156 pub fn test_serialize_deserialize<T: Serialize + for<'de> Deserialize<'de> + PartialEq>(x: T) {
157 let serializer = serde_assert::Serializer::builder().is_human_readable(true).build();
158 let tokens = x.serialize(&serializer).unwrap();
159 let mut deserializer = serde_assert::Deserializer::builder(tokens).is_human_readable(true).build();
160 let result = T::deserialize(&mut deserializer).unwrap();
161 assert!(result == x);
162
163 let serializer = serde_assert::Serializer::builder().is_human_readable(false).build();
164 let tokens = x.serialize(&serializer).unwrap();
165 let mut deserializer = serde_assert::Deserializer::builder(tokens).is_human_readable(false).build();
166 let result = T::deserialize(&mut deserializer).unwrap();
167 assert!(result == x);
168 }
169}
170
171#[cfg(test)]
172use crate::integer::{BigIntRing, IntegerRingStore};
173
174#[test]
175fn test_serialize() {
176 let value = BigIntRing::RING.add(BigIntRing::RING.power_of_two(128), BigIntRing::RING.one());
177 let json = serde_json::to_string(&SerializeWithRing::new(&value, BigIntRing::RING)).unwrap();
178 assert_eq!("\"340282366920938463463374607431768211457\"", json);
179}