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 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 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 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 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 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 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 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 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 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 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 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 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 Type::TYPE_FLOAT => {
254
255 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 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 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 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 _ => {
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 let len = input_stream.read_raw_varint32().unwrap();
398 let old_limit = input_stream.push_limit(len as u64).unwrap();
399 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}