mysten_common/rpc_format/
json.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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        // Account for the quotes around the string
72        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        // Account for the opening bracket
78        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        // Account for the opening brace
84        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        // Account for the comma (or closing bracket)
94        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        // Account for quotes, colon, and comma (or closing brace)
106        meter.charge(4 + key.len())?;
107        map.insert(key, value);
108        Ok(())
109    }
110}