mysten_common/rpc_format/
proto.rs1use prost_types::Struct;
5use prost_types::Value;
6use prost_types::value::Kind;
7
8use crate::rpc_format::Format;
9use crate::rpc_format::Meter;
10use crate::rpc_format::MeterError;
11
12impl Format for Value {
13 type Vec = Vec<Value>;
14 type Map = Struct;
15
16 fn is_null(&self) -> bool {
17 matches!(self.kind, Some(Kind::NullValue(_)))
18 }
19
20 fn is_bool(&self) -> bool {
21 self.as_bool().is_some()
22 }
23
24 fn is_number(&self) -> bool {
25 matches!(self.kind, Some(Kind::NumberValue(_)))
26 }
27
28 fn is_string(&self) -> bool {
29 self.as_string().is_some()
30 }
31
32 fn is_array(&self) -> bool {
33 self.as_array().is_some()
34 }
35
36 fn is_object(&self) -> bool {
37 self.as_object().is_some()
38 }
39
40 fn as_bool(&self) -> Option<bool> {
41 if let Some(Kind::BoolValue(b)) = &self.kind {
42 Some(*b)
43 } else {
44 None
45 }
46 }
47
48 fn as_string(&self) -> Option<&str> {
49 if let Some(Kind::StringValue(value)) = &self.kind {
50 Some(value)
51 } else {
52 None
53 }
54 }
55
56 fn as_array(&self) -> Option<&Self::Vec> {
57 if let Some(Kind::ListValue(value)) = &self.kind {
58 Some(&value.values)
59 } else {
60 None
61 }
62 }
63
64 fn as_object(&self) -> Option<&Self::Map> {
65 if let Some(Kind::StructValue(value)) = &self.kind {
66 Some(value)
67 } else {
68 None
69 }
70 }
71
72 fn null<M: Meter>(meter: &mut M) -> Result<Self, MeterError> {
73 meter.charge(std::mem::size_of::<Value>())?;
74 Ok(Kind::NullValue(0).into())
75 }
76
77 fn bool<M: Meter>(meter: &mut M, value: bool) -> Result<Self, MeterError> {
78 meter.charge(std::mem::size_of::<Value>())?;
79 Ok(Self::from(value))
80 }
81
82 fn number<M: Meter>(meter: &mut M, value: u32) -> Result<Self, MeterError> {
83 meter.charge(std::mem::size_of::<Value>())?;
84 Ok(Self::from(value))
85 }
86
87 fn string<M: Meter>(meter: &mut M, value: String) -> Result<Self, MeterError> {
88 meter.charge(std::mem::size_of::<Value>() + value.len())?;
89 Ok(Self::from(value))
90 }
91
92 fn vec<M: Meter>(meter: &mut M, value: Self::Vec) -> Result<Self, MeterError> {
93 meter.charge(std::mem::size_of::<Value>())?;
94 Ok(Self::from(value))
95 }
96
97 fn map<M: Meter>(meter: &mut M, value: Self::Map) -> Result<Self, MeterError> {
98 meter.charge(std::mem::size_of::<Value>())?;
99 Ok(Self::from(Kind::StructValue(value)))
100 }
101
102 fn vec_push_element<M: Meter>(
103 _meter: &mut M,
104 vec: &mut Self::Vec,
105 value: Self,
106 ) -> Result<(), MeterError> {
107 vec.push(value);
108 Ok(())
109 }
110
111 fn map_push_field<M: Meter>(
112 meter: &mut M,
113 map: &mut Self::Map,
114 key: String,
115 value: Self,
116 ) -> Result<(), MeterError> {
117 meter.charge(key.len())?;
118 map.fields.insert(key, value);
119 Ok(())
120 }
121}