1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
pub use defaults::Defaults;
pub use serde::{Deserialize, Serialize};
pub use serde_json::Value;
pub use serde_with::skip_serializing_none;
pub use std::{
collections::BTreeMap,
convert::AsRef,
fmt::{self, Display},
sync::Arc,
};
pub use strum::AsRefStr;
#[derive(Clone, Debug)]
pub struct Null {}
impl Display for Null {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "null")
}
}
impl Serialize for Null {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_none()
}
}
impl<'de> Deserialize<'de> for Null {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let value = serde_json::Value::deserialize(deserializer)?;
match value.is_null() {
true => Ok(Null {}),
false => Err(serde::de::Error::custom("Exepected")),
}
}
}
pub type Boolean = bool;
pub type Integer = i64;
pub type Number = f64;
pub type Array = Vec<Primitive>;
pub type Object = BTreeMap<String, Primitive>;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Primitive {
Null(Null),
Boolean(Boolean),
Integer(Integer),
Number(Number),
String(String),
Object(Object),
Array(Array),
}