mysten_common/rpc_format/
proto.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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}