3
3
/// See https://opentelemetry.io/docs/specs/otlp/#json-protobuf-encoding for more details
4
4
#[ cfg( all( feature = "with-serde" , feature = "gen-tonic-messages" ) ) ]
5
5
pub ( crate ) mod serializers {
6
- use crate :: tonic:: common:: v1:: any_value:: Value ;
6
+ use crate :: tonic:: common:: v1:: any_value:: { self , Value } ;
7
7
use crate :: tonic:: common:: v1:: AnyValue ;
8
8
use serde:: de:: { self , MapAccess , Visitor } ;
9
9
use serde:: ser:: SerializeStruct ;
@@ -52,23 +52,86 @@ pub(crate) mod serializers {
52
52
// Serialize any_value::Value using its own implementation
53
53
// If value is None, it will be serialized as such
54
54
match value {
55
- Some ( value) => value. value . serialize ( serializer) ,
55
+ Some ( any_value) => match & any_value. value {
56
+ Some ( Value :: IntValue ( i) ) => serialize_i64_to_string ( i, serializer) ,
57
+ Some ( value) => value. serialize ( serializer) ,
58
+ None => serializer. serialize_none ( ) ,
59
+ } ,
56
60
None => serializer. serialize_none ( ) ,
57
61
}
58
-
59
62
}
60
63
61
64
pub fn deserialize_from_value < ' de , D > ( deserializer : D ) -> Result < Option < AnyValue > , D :: Error >
62
- where
63
- D : Deserializer < ' de > ,
64
- {
65
- // Deserialize any_value::Value using its own implementation
66
- let value = Option :: < Value > :: deserialize ( deserializer) ?;
65
+ where
66
+ D : Deserializer < ' de > ,
67
+ {
68
+ struct ValueVisitor ;
69
+
70
+ impl < ' de > de:: Visitor < ' de > for ValueVisitor {
71
+ type Value = AnyValue ;
72
+
73
+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
74
+ formatter. write_str ( "a JSON object for AnyValue" )
75
+ }
67
76
68
- // Wrap the deserialized value in AnyValue
69
- Ok ( Some ( AnyValue { value } ) )
77
+ fn visit_map < V > ( self , mut map : V ) -> Result < AnyValue , V :: Error >
78
+ where
79
+ V : de:: MapAccess < ' de > ,
80
+ {
81
+ let mut value: Option < any_value:: Value > = None ;
82
+
83
+ while let Some ( key) = map. next_key :: < String > ( ) ? {
84
+ let key_str = key. as_str ( ) ;
85
+ match key_str {
86
+ "stringValue" => {
87
+ let s = map. next_value ( ) ?;
88
+ value = Some ( any_value:: Value :: StringValue ( s) ) ;
89
+ } ,
90
+ "boolValue" => {
91
+ let b = map. next_value ( ) ?;
92
+ value = Some ( any_value:: Value :: BoolValue ( b) ) ;
93
+ } ,
94
+ "intValue" => {
95
+ let value_str = map. next_value :: < String > ( ) ?;
96
+ let int_value = value_str. parse :: < i64 > ( )
97
+ . map_err ( de:: Error :: custom) ?;
98
+ value = Some ( any_value:: Value :: IntValue ( int_value) ) ;
99
+ } ,
100
+ "doubleValue" => {
101
+ let d = map. next_value ( ) ?;
102
+ value = Some ( any_value:: Value :: DoubleValue ( d) ) ;
103
+ } ,
104
+ "arrayValue" => {
105
+ let a = map. next_value ( ) ?;
106
+ value = Some ( any_value:: Value :: ArrayValue ( a) ) ;
107
+ } ,
108
+ "kvlistValue" => {
109
+ let kv = map. next_value ( ) ?;
110
+ value = Some ( any_value:: Value :: KvlistValue ( kv) ) ;
111
+ } ,
112
+ "bytesValue" => {
113
+ let bytes = map. next_value ( ) ?;
114
+ value = Some ( any_value:: Value :: BytesValue ( bytes) ) ;
115
+ } ,
116
+ _ => {
117
+ //skip unknown keys, and handle error later.
118
+ continue
119
+ }
120
+ }
121
+ }
122
+
123
+ if let Some ( v) = value {
124
+ Ok ( AnyValue { value : Some ( v) } )
125
+ } else {
126
+ Err ( de:: Error :: custom ( "Invalid data for AnyValue, no known keys found" ) )
127
+ }
128
+ }
70
129
}
71
130
131
+ let value = deserializer. deserialize_map ( ValueVisitor ) ?;
132
+ Ok ( Some ( value) )
133
+ }
134
+
72
135
pub fn serialize_u64_to_string < S > ( value : & u64 , serializer : S ) -> Result < S :: Ok , S :: Error >
73
136
where
74
137
S : Serializer ,
@@ -84,6 +147,22 @@ pub(crate) mod serializers {
84
147
let s: String = Deserialize :: deserialize ( deserializer) ?;
85
148
s. parse :: < u64 > ( ) . map_err ( de:: Error :: custom)
86
149
}
150
+
151
+ pub fn serialize_i64_to_string < S > ( value : & i64 , serializer : S ) -> Result < S :: Ok , S :: Error >
152
+ where
153
+ S : Serializer ,
154
+ {
155
+ let s = value. to_string ( ) ;
156
+ serializer. serialize_str ( & s)
157
+ }
158
+
159
+ pub fn deserialize_string_to_i64 < ' de , D > ( deserializer : D ) -> Result < i64 , D :: Error >
160
+ where
161
+ D : Deserializer < ' de > ,
162
+ {
163
+ let s: String = Deserialize :: deserialize ( deserializer) ?;
164
+ s. parse :: < i64 > ( ) . map_err ( de:: Error :: custom)
165
+ }
87
166
}
88
167
89
168
#[ cfg( feature = "gen-tonic-messages" ) ]
0 commit comments