xCommonLib/serial/
proto_to_json.rs

1
2use crate::{serial::api_descriptor::{is_array, ServiceApiDescriptor}, base::status::Status};
3use protobuf::descriptor::field_descriptor_proto::Type;
4use protobuf::descriptor::FieldDescriptorProto;
5use protobuf::CodedInputStream;
6use serde_json::Value;
7use tracing::info;
8use super::api_descriptor::{is_map, DescriptorProtoHolder};
9
10fn put_value_in_json(
11    field: &FieldDescriptorProto,
12    value: &Value,
13    value_map: &mut serde_json::map::Map<String, Value>,
14) {
15    let is_array = is_array(field);
16    if is_array {
17        let arr_value = value_map.get_mut(field.name.as_ref().unwrap());
18        if arr_value.is_none() {
19            let mut arr_value: Vec<Value> = vec![];
20            arr_value.push(value.clone());
21            value_map.insert(
22                field.name.clone().unwrap(),
23                serde_json::Value::Array(arr_value),
24            );
25        } else {
26            let inner_value = arr_value.unwrap();
27            let arr_value = inner_value.as_array_mut().unwrap();
28            arr_value.push(value.clone());
29        }
30    } else {
31        value_map.insert(field.name.clone().unwrap(), value.clone());
32    }
33}
34
35fn read_proto_to_json_value(
36    field_type: Type,
37    field: &FieldDescriptorProto,
38    msg_name: &str,
39    service_api_descriptor: &ServiceApiDescriptor,
40    input_stream: &mut CodedInputStream,
41) -> Result<Value, Status> {
42    match field_type {
43        // i64
44        Type::TYPE_INT64 => {
45            let value = input_stream.read_int64();
46
47            if value.is_err() {
48                return Err(Status::error(format!(
49                    "读取 {} {} 为 i64 错误!",
50                    msg_name,
51                    field.name.as_ref().unwrap()
52                )));
53            }
54
55            let value = value.unwrap();
56            let value = serde_json::Value::Number(serde_json::Number::from(value));
57            Ok(value)
58        }
59        // ui64
60        Type::TYPE_UINT64 => {
61            let value = input_stream.read_uint64();
62
63            if value.is_err() {
64                return Err(Status::error(format!(
65                    "读取 {} {} 为 ui64 错误!",
66                    msg_name,
67                    field.name.as_ref().unwrap()
68                )));
69            }
70
71            let value = value.unwrap();
72
73            let value = serde_json::Value::Number(serde_json::Number::from(value));
74
75            Ok(value)
76        }
77        // i32
78        Type::TYPE_INT32 => {
79            let value = input_stream.read_int32();
80
81            if value.is_err() {
82                return Err(Status::error(format!(
83                    "读取 {} {} 为 i32 错误!",
84                    msg_name,
85                    field.name.as_ref().unwrap()
86                )));
87            }
88
89            let value = value.unwrap();
90
91            let value = serde_json::Value::Number(serde_json::Number::from(value));
92
93            Ok(value)
94        }
95        // fixed64
96        Type::TYPE_FIXED64 => {
97            let value = input_stream.read_fixed64();
98            if value.is_err() {
99                return Err(Status::error(format!(
100                    "读取 {} {} 为 fixed64 错误!",
101                    msg_name,
102                    field.name.as_ref().unwrap()
103                )));
104            }
105            let value = value.unwrap();
106
107            let value = serde_json::Value::Number(serde_json::Number::from(value));
108
109            Ok(value)
110        }
111        // fixed32
112        Type::TYPE_FIXED32 => {
113            let value = input_stream.read_fixed32();
114
115            if value.is_err() {
116                return Err(Status::error(format!(
117                    "读取 {} {} 为 fixed32 错误!",
118                    msg_name,
119                    field.name.as_ref().unwrap()
120                )));
121            }
122
123            let value = value.unwrap();
124
125            let value = serde_json::Value::Number(serde_json::Number::from(value));
126
127            Ok(value)
128        }
129        // u32
130        Type::TYPE_UINT32 => {
131            let value = input_stream.read_uint32();
132
133            if value.is_err() {
134                return Err(Status::error(format!(
135                    "读取 {} {} 为 u32 错误!",
136                    msg_name,
137                    field.name.as_ref().unwrap()
138                )));
139            }
140
141            let value = value.unwrap();
142
143            let value = serde_json::Value::Number(serde_json::Number::from(value));
144
145            Ok(value)
146        }
147        // enum
148        Type::TYPE_ENUM => {
149            let value = input_stream.read_int32();
150
151            if value.is_err() {
152                return Err(Status::error(format!(
153                    "读取 {} {} 为 enum 错误!",
154                    msg_name,
155                    field.name.as_ref().unwrap()
156                )));
157            }
158
159            let value = value.unwrap();
160
161            let value = serde_json::Value::Number(serde_json::Number::from(value));
162
163            Ok(value)
164        }
165        // sfixed32
166        Type::TYPE_SFIXED32 => {
167            let value = input_stream.read_sfixed32();
168
169            if value.is_err() {
170                return Err(Status::error(format!(
171                    "读取 {} {} 为 sfixed32 错误!",
172                    msg_name,
173                    field.name.as_ref().unwrap()
174                )));
175            }
176
177            let value = value.unwrap();
178
179            let value = serde_json::Value::Number(serde_json::Number::from(value));
180
181            Ok(value)
182        }
183        // sfixed64
184        Type::TYPE_SFIXED64 => {
185            let value = input_stream.read_sfixed64();
186
187            if value.is_err() {
188                return Err(Status::error(format!(
189                    "读取 {} {} 为 sfixed64 错误!",
190                    msg_name,
191                    field.name.as_ref().unwrap()
192                )));
193            }
194
195            let value = value.unwrap();
196
197            let value = serde_json::Value::Number(serde_json::Number::from(value));
198
199            Ok(value)
200        }
201        // sint32
202        Type::TYPE_SINT32 => {
203            let value = input_stream.read_sint32();
204
205            if value.is_err() {
206                return Err(Status::error(format!(
207                    "读取 {} {} 为 sint32 错误!",
208                    msg_name,
209                    field.name.as_ref().unwrap()
210                )));
211            }
212
213            let value = value.unwrap();
214
215            let value = serde_json::Value::Number(serde_json::Number::from(value));
216
217            Ok(value)
218        }
219        // sint64
220        Type::TYPE_SINT64 => {
221            let value = input_stream.read_sint64();
222
223            if value.is_err() {
224                return Err(Status::error(format!(
225                    "读取 {} {} 为 sint64 错误!",
226                    msg_name,
227                    field.name.as_ref().unwrap()
228                )));
229            }
230            let value = value.unwrap();
231            let value = serde_json::Value::Number(serde_json::Number::from(value));
232            Ok(value)
233        }
234        // double
235        Type::TYPE_DOUBLE => {
236            let value = input_stream.read_double();
237
238            if value.is_err() {
239                return Err(Status::error(format!(
240                    "读取 {} {} 为 double 错误!",
241                    msg_name,
242                    field.name.as_ref().unwrap()
243                )));
244            }
245
246            let value = value.unwrap();
247
248            let value = serde_json::Value::Number(serde_json::Number::from_f64(value).unwrap());
249
250            Ok(value)
251        }
252        //
253        Type::TYPE_FLOAT => {
254
255            // if field.name() == "bid_vol" {
256            //   info!("field = {:?} pos = {}", field, input_stream.pos());
257            // }
258          
259            let value = input_stream.read_float();
260
261            if let Err(err) = value {
262                return Err(Status::error(format!(
263                    "读取 {} {} 为 float 错误: {:?}",
264                    msg_name,
265                    field.name.as_ref().unwrap(),
266                    err
267                )));
268            }
269
270            let value = value.unwrap();
271
272            let value =
273                serde_json::Value::Number(serde_json::Number::from_f64(value as f64).unwrap());
274
275            Ok(value)
276        }
277        // string
278        Type::TYPE_STRING => {
279            let value = input_stream.read_string();
280
281            if value.is_err() {
282                return Err(Status::error(format!(
283                    "读取 {} {} 为 string 错误!",
284                    msg_name,
285                    field.name.as_ref().unwrap()
286                )));
287            }
288
289            let value = value.unwrap();
290
291            let value = serde_json::Value::String(value);
292
293            Ok(value)
294        }
295        // 对象
296        Type::TYPE_MESSAGE => {
297            let type_name = field.type_name.as_ref().unwrap();
298            let len = input_stream.read_raw_varint64();
299            if len.is_err() {
300                return Err(Status::error(format!(
301                    "读取  {} {} 为 message 错误!",
302                    msg_name,
303                    field.name.as_ref().unwrap()
304                )));
305            }
306
307            let len = len.unwrap();
308
309            let old_limit = input_stream.push_limit(len);
310
311            if old_limit.is_err() {
312                return Err(Status::error(format!(
313                    "读取  {} {} 为 message 错误!",
314                    msg_name,
315                    field.name.as_ref().unwrap()
316                )));
317            }
318            let old_limit = old_limit.unwrap();
319
320            let value = proto_to_json_by_is(type_name, service_api_descriptor, input_stream)?;
321
322            input_stream.pop_limit(old_limit);
323
324            Ok(value)
325        }
326        // 对象
327        Type::TYPE_BOOL => {
328            let value = input_stream.read_bool();
329            if value.is_err() {
330                return Err(Status::error(format!(
331                    "读取  {} {} 为 bool 错误!",
332                    msg_name,
333                    field.name.as_ref().unwrap()
334                )));
335            }
336
337            let value = value.unwrap();
338
339            let value = serde_json::Value::Bool(value);
340
341            Ok(value)
342        }
343        //
344        _ => {
345            return Err(Status::error(format!(
346                "无法识别 {} {} 的类型",
347                msg_name,
348                field.name.as_ref().unwrap()
349            )));
350        }
351    }
352}
353
354fn get_field(tag: u32, desc_proto_holder: &DescriptorProtoHolder) -> Option<&FieldDescriptorProto> {
355    let field_index = desc_proto_holder.field_index_map.get(&tag);
356
357    if field_index.is_none() {
358        return None;
359    }
360
361    let field_index = field_index.unwrap();
362
363    desc_proto_holder
364        .descriptor_proto
365        .field
366        .get(*field_index as usize)
367}
368
369pub fn proto_to_json_by_is(
370    msg_name: &str,
371    service_api_descriptor: &ServiceApiDescriptor,
372    input_stream: &mut CodedInputStream,
373) -> Result<Value, Status> {
374
375    let msg_descriptor_holder = service_api_descriptor.message_descriptor_holder.get(msg_name);
376
377    if msg_descriptor_holder.is_none() {
378        return Err(Status::error(format!("类型 {} 不存在", msg_name)));
379    }
380
381    let msg_descriptor_holder = msg_descriptor_holder.unwrap();
382
383    let mut value_map = serde_json::map::Map::new();
384
385    while let Some(tag) = input_stream.read_raw_tag_or_eof().unwrap() {
386        let field = get_field(tag, msg_descriptor_holder);
387
388        if field.is_none() {
389            continue;
390        }
391        let field = field.unwrap();
392
393        let field_type = field.type_.unwrap().unwrap();
394
395        if field_type == Type::TYPE_MESSAGE && is_map(field, service_api_descriptor) {
396            // 是 map 类型
397            let len = input_stream.read_raw_varint32().unwrap();
398            let old_limit = input_stream.push_limit(len as u64).unwrap();
399            //
400            let map_type_name = field.type_name.as_ref().unwrap();
401
402            let map_msg_descriptor_holder = service_api_descriptor
403                .message_descriptor_holder
404                .get(map_type_name);
405
406            if map_msg_descriptor_holder.is_none() {
407                return Err(Status::error(format!(
408                    "map {} 描述不存在",
409                    map_type_name
410                )));
411            }
412
413            let map_msg_descriptor_holder = map_msg_descriptor_holder.unwrap();
414
415            let mut key: Value = Value::Null;
416            let mut value: Value = Value::Null;
417
418            while let Some(tag) = input_stream.read_raw_tag_or_eof().unwrap() {
419                let field = get_field(tag, map_msg_descriptor_holder);
420
421                if field.is_none() {
422                    continue;
423                }
424
425                let field = field.unwrap();
426
427                let field_type = field.type_.unwrap().unwrap();
428
429                if field.number() == 1 {
430                    key = read_proto_to_json_value(
431                        field_type,
432                        field,
433                        msg_name,
434                        service_api_descriptor,
435                        input_stream,
436                    )?;
437                } else {
438                    value = read_proto_to_json_value(
439                        field_type,
440                        field,
441                        msg_name,
442                        service_api_descriptor,
443                        input_stream,
444                    )?;
445                }
446            }
447
448            input_stream.pop_limit(old_limit);
449
450            let obj_value = value_map.get_mut(field.name.as_ref().unwrap());
451
452            if obj_value.is_none() {
453                let mut obj_value = serde_json::map::Map::new();
454
455                obj_value.insert(key.as_str().unwrap().to_string(), value);
456
457                value_map.insert(field.name.clone().unwrap(), Value::Object(obj_value));
458            } else {
459                let obj_value = obj_value.unwrap();
460                let obj_value = obj_value.as_object_mut().unwrap();
461                obj_value.insert(key.as_str().unwrap().to_string(), value);
462            }
463        } else {
464            let value = read_proto_to_json_value(
465                field_type,
466                field,
467                msg_name,
468                service_api_descriptor,
469                input_stream,
470            )?;
471
472            put_value_in_json(field, &value, &mut value_map);
473        }
474    }
475
476    let value = Value::Object(value_map);
477
478    Ok(value)
479}
480
481pub fn proto_to_json(
482    proto_bytes: &Vec<u8>,
483    msg_name: &str,
484    service_api_descriptor: &ServiceApiDescriptor,
485) -> Result<Value, Status> {
486    let mut input_stream = CodedInputStream::from_bytes(&*proto_bytes);
487
488    proto_to_json_by_is(msg_name, service_api_descriptor, &mut input_stream)
489}