Skip to main content

hegel/extras/serde_json/
default.rs

1use std::collections::HashMap;
2
3use serde_json::{Map, Number, Value};
4
5use crate::generators::{self as gs, BoxedGenerator, DefaultGenerator, Generator};
6
7use super::{NumberGenerator, ValueGenerator, numbers, values};
8
9impl DefaultGenerator for Number {
10    type Generator = NumberGenerator;
11    fn default_generator() -> Self::Generator {
12        numbers()
13    }
14}
15
16impl DefaultGenerator for Value {
17    type Generator = ValueGenerator;
18    fn default_generator() -> Self::Generator {
19        values()
20    }
21}
22
23// `serde_json::Map<K, V>` is generic in its type signature, but every public
24// constructor and trait impl is hardcoded to `Map<String, Value>`. There's no
25// way to construct any other instantiation through the crate's public API,
26// so this impl covers the full usable space.
27impl DefaultGenerator for Map<String, Value> {
28    type Generator = BoxedGenerator<'static, Map<String, Value>>;
29    fn default_generator() -> Self::Generator {
30        gs::hashmaps(
31            <String as DefaultGenerator>::default_generator(),
32            <Value as DefaultGenerator>::default_generator(),
33        )
34        .map(|m: HashMap<String, Value>| m.into_iter().collect::<Map<String, Value>>())
35        .boxed()
36    }
37}
38
39#[cfg(feature = "serde_json_raw_value")]
40impl DefaultGenerator for Box<serde_json::value::RawValue> {
41    type Generator = super::RawValueGenerator;
42    fn default_generator() -> Self::Generator {
43        super::raw_values()
44    }
45}