mysten_common/rpc_format/
json.rs1use serde_json::Map;
5use serde_json::Value as Json;
6
7use crate::rpc_format::Format;
8use crate::rpc_format::Meter;
9use crate::rpc_format::MeterError;
10
11impl Format for Json {
12 type Vec = Vec<Self>;
13 type Map = Map<String, Self>;
14
15 fn is_null(&self) -> bool {
16 self.is_null()
17 }
18
19 fn is_bool(&self) -> bool {
20 self.is_boolean()
21 }
22
23 fn is_number(&self) -> bool {
24 self.is_number()
25 }
26
27 fn is_string(&self) -> bool {
28 self.is_string()
29 }
30
31 fn is_array(&self) -> bool {
32 self.is_array()
33 }
34
35 fn is_object(&self) -> bool {
36 self.is_object()
37 }
38
39 fn as_bool(&self) -> Option<bool> {
40 self.as_bool()
41 }
42
43 fn as_string(&self) -> Option<&str> {
44 self.as_str()
45 }
46
47 fn as_array(&self) -> Option<&Self::Vec> {
48 self.as_array()
49 }
50
51 fn as_object(&self) -> Option<&Self::Map> {
52 self.as_object()
53 }
54
55 fn null<M: Meter>(meter: &mut M) -> Result<Self, MeterError> {
56 meter.charge("null".len())?;
57 Ok(Json::Null)
58 }
59
60 fn bool<M: Meter>(meter: &mut M, value: bool) -> Result<Self, MeterError> {
61 meter.charge(if value { "true".len() } else { "false".len() })?;
62 Ok(Json::Bool(value))
63 }
64
65 fn number<M: Meter>(meter: &mut M, value: u32) -> Result<Self, MeterError> {
66 meter.charge(if value == 0 { 1 } else { value.ilog10() + 1 } as usize)?;
67 Ok(Json::Number(value.into()))
68 }
69
70 fn string<M: Meter>(meter: &mut M, value: String) -> Result<Self, MeterError> {
71 meter.charge(2 + value.len())?;
73 Ok(Json::String(value))
74 }
75
76 fn vec<M: Meter>(meter: &mut M, value: Self::Vec) -> Result<Self, MeterError> {
77 meter.charge(1)?;
79 Ok(Json::Array(value))
80 }
81
82 fn map<M: Meter>(meter: &mut M, value: Self::Map) -> Result<Self, MeterError> {
83 meter.charge(1)?;
85 Ok(Json::Object(value))
86 }
87
88 fn vec_push_element<M: Meter>(
89 meter: &mut M,
90 vec: &mut Self::Vec,
91 value: Self,
92 ) -> Result<(), MeterError> {
93 meter.charge(1)?;
95 vec.push(value);
96 Ok(())
97 }
98
99 fn map_push_field<M: Meter>(
100 meter: &mut M,
101 map: &mut Self::Map,
102 key: String,
103 value: Self,
104 ) -> Result<(), MeterError> {
105 meter.charge(4 + key.len())?;
107 map.insert(key, value);
108 Ok(())
109 }
110}