1#[derive(Debug, Clone, Copy)]
19pub struct DeserializerConfig {
20 max_array_size: Option<usize>,
22 max_map_size: Option<usize>,
24 max_recursion_depth: u8,
26 max_indefinite_iterations: Option<usize>,
28}
29
30impl Default for DeserializerConfig {
31 fn default() -> Self {
39 Self {
40 max_array_size: Some(100_000),
41 max_map_size: Some(100_000),
42 max_recursion_depth: 128,
43 max_indefinite_iterations: Some(100_000),
44 }
45 }
46}
47
48impl DeserializerConfig {
49 #[must_use]
54 pub const fn unlimited() -> Self {
55 Self {
56 max_array_size: None,
57 max_map_size: None,
58 max_recursion_depth: 255,
59 max_indefinite_iterations: None,
60 }
61 }
62
63 #[must_use]
71 pub const fn strict() -> Self {
72 Self {
73 max_array_size: Some(1_000),
74 max_map_size: Some(1_000),
75 max_recursion_depth: 32,
76 max_indefinite_iterations: Some(1_000),
77 }
78 }
79
80 #[must_use]
84 pub const fn max_array_size(mut self, limit: usize) -> Self {
85 self.max_array_size = Some(limit);
86 self
87 }
88
89 #[must_use]
91 pub const fn unlimited_array_size(mut self) -> Self {
92 self.max_array_size = None;
93 self
94 }
95
96 #[must_use]
100 pub const fn max_map_size(mut self, limit: usize) -> Self {
101 self.max_map_size = Some(limit);
102 self
103 }
104
105 #[must_use]
107 pub const fn unlimited_map_size(mut self) -> Self {
108 self.max_map_size = None;
109 self
110 }
111
112 #[must_use]
116 pub const fn max_recursion_depth(mut self, depth: u8) -> Self {
117 self.max_recursion_depth = depth;
118 self
119 }
120
121 #[must_use]
126 pub const fn max_indefinite_iterations(mut self, limit: usize) -> Self {
127 self.max_indefinite_iterations = Some(limit);
128 self
129 }
130
131 #[must_use]
133 pub const fn unlimited_indefinite_iterations(mut self) -> Self {
134 self.max_indefinite_iterations = None;
135 self
136 }
137
138 #[must_use]
140 pub const fn get_max_array_size(&self) -> Option<usize> {
141 self.max_array_size
142 }
143
144 #[must_use]
146 pub const fn get_max_map_size(&self) -> Option<usize> {
147 self.max_map_size
148 }
149
150 #[must_use]
152 pub const fn get_max_recursion_depth(&self) -> u8 {
153 self.max_recursion_depth
154 }
155
156 #[must_use]
158 pub const fn get_max_indefinite_iterations(&self) -> Option<usize> {
159 self.max_indefinite_iterations
160 }
161}
162
163#[cfg(test)]
164mod tests {
165 use super::*;
166
167 #[test]
168 fn test_default_config() {
169 let config = DeserializerConfig::default();
170 assert_eq!(config.get_max_array_size(), Some(100_000));
171 assert_eq!(config.get_max_map_size(), Some(100_000));
172 assert_eq!(config.get_max_recursion_depth(), 128);
173 assert_eq!(config.get_max_indefinite_iterations(), Some(100_000));
174 }
175
176 #[test]
177 fn test_unlimited_config() {
178 let config = DeserializerConfig::unlimited();
179 assert_eq!(config.get_max_array_size(), None);
180 assert_eq!(config.get_max_map_size(), None);
181 assert_eq!(config.get_max_recursion_depth(), 255);
182 assert_eq!(config.get_max_indefinite_iterations(), None);
183 }
184
185 #[test]
186 fn test_strict_config() {
187 let config = DeserializerConfig::strict();
188 assert_eq!(config.get_max_array_size(), Some(1_000));
189 assert_eq!(config.get_max_map_size(), Some(1_000));
190 assert_eq!(config.get_max_recursion_depth(), 32);
191 assert_eq!(config.get_max_indefinite_iterations(), Some(1_000));
192 }
193
194 #[test]
195 fn test_custom_config() {
196 let config = DeserializerConfig::default()
197 .max_array_size(500)
198 .max_map_size(250)
199 .max_recursion_depth(16)
200 .max_indefinite_iterations(1000);
201
202 assert_eq!(config.get_max_array_size(), Some(500));
203 assert_eq!(config.get_max_map_size(), Some(250));
204 assert_eq!(config.get_max_recursion_depth(), 16);
205 assert_eq!(config.get_max_indefinite_iterations(), Some(1000));
206 }
207
208 #[test]
209 fn test_unlimited_modifications() {
210 let config = DeserializerConfig::default()
211 .unlimited_array_size()
212 .unlimited_map_size()
213 .unlimited_indefinite_iterations();
214
215 assert_eq!(config.get_max_array_size(), None);
216 assert_eq!(config.get_max_map_size(), None);
217 assert_eq!(config.get_max_indefinite_iterations(), None);
218 }
219}