1use super::api_descriptor::{get_wire_type, is_map, make_tag};
2use crate::base::status::Status;
3use crate::serial::api_descriptor::{is_array, ServiceApiDescriptor};
4use protobuf::descriptor::field_descriptor_proto::Type;
5use protobuf::descriptor::FieldDescriptorProto;
6use protobuf::CodedOutputStream;
7use serde_json::Value;
8
9fn compute_one_bool_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
11 if !json_value.is_boolean() {
12 return Err(Status::error(format!(
13 "{} 类型错误!",
14 field.name.as_ref().unwrap()
15 )));
16 }
17 let value = json_value.as_bool().unwrap();
18 if value == false {
19 return Ok(0);
20 }
21 let tag = (field.number() << 3) | 8;
23 let tag_size = ::protobuf::rt::compute_raw_varint64_size(tag as u64);
24 return Ok(tag_size + 1);
25}
26
27fn compute_bool_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
28 let mut size = 0;
29 if is_array(field) {
30 if !json_value.is_array() {
31 return Err(Status::error(format!(
32 "{} 类型错误, 应为数组!",
33 field.name.as_ref().unwrap()
34 )));
35 }
36 for ele in json_value.as_array().unwrap() {
37 size += compute_one_bool_size(field, ele)?;
38 }
39 Ok(size)
40 } else {
41 compute_one_bool_size(field, json_value)
42 }
43}
44
45fn write_one_bool(
46 field: &FieldDescriptorProto,
47 json_value: &Value,
48 output_stream: &mut CodedOutputStream,
49) -> Result<(), Status> {
50 let number = field.number.unwrap() as u32;
51 let value = json_value.as_bool().unwrap();
52 if value == false {
53 return Ok(());
54 }
55 let result = output_stream.write_bool(number, value);
56 if result.is_err() {
57 return Err(Status::error(format!(
58 "{} 序列化失败!",
59 field.name.as_ref().unwrap()
60 )));
61 }
62 Ok(())
63}
64
65fn write_bool(
67 field: &FieldDescriptorProto,
68 json_value: &Value,
69 output_stream: &mut CodedOutputStream,
70) -> Result<(), Status> {
71 if is_array(field) {
72 for ele in json_value.as_array().unwrap() {
73 write_one_bool(field, ele, output_stream)?;
74 }
75 Ok(())
76 } else {
77 write_one_bool(field, json_value, output_stream)
78 }
79}
80
81fn compute_one_float_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
84 if !json_value.is_f64() {
85 return Err(Status::error(format!(
86 "{} 类型错误!",
87 field.name.as_ref().unwrap()
88 )));
89 }
90 let value = json_value.as_f64().unwrap();
91 if value == 0.0 {
92 return Ok(0);
93 }
94 let tag = (field.number() << 3) | 2;
95 let tag_size = ::protobuf::rt::compute_raw_varint64_size(tag as u64);
96
97 return Ok(tag_size + 4);
98}
99
100fn compute_float_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
101 let mut size = 0;
102 if is_array(field) {
103 if !json_value.is_array() {
104 return Err(Status::error(format!(
105 "{} 类型错误, 应为数组!",
106 field.name.as_ref().unwrap()
107 )));
108 }
109 for ele in json_value.as_array().unwrap() {
110 size += compute_one_float_size(field, ele)?;
111 }
112 Ok(size)
113 } else {
114 compute_one_float_size(field, json_value)
115 }
116}
117
118fn write_one_float(
119 field: &FieldDescriptorProto,
120 json_value: &Value,
121 output_stream: &mut CodedOutputStream,
122) -> Result<(), Status> {
123 let number = field.number.unwrap() as u32;
124 let value = json_value.as_f64().unwrap();
125 if value == 0.0 {
126 return Ok(());
127 }
128 let result = output_stream.write_float(number, value as f32);
129 if result.is_err() {
130 return Err(Status::error(format!(
131 "{} 序列化失败!",
132 field.name.as_ref().unwrap()
133 )));
134 }
135 Ok(())
136}
137
138fn write_float(
140 field: &FieldDescriptorProto,
141 json_value: &Value,
142 output_stream: &mut CodedOutputStream,
143) -> Result<(), Status> {
144 if is_array(field) {
145 for ele in json_value.as_array().unwrap() {
146 write_one_float(field, ele, output_stream)?;
147 }
148 Ok(())
149 } else {
150 write_one_float(field, json_value, output_stream)
151 }
152}
153
154fn compute_one_double_size(
155 field: &FieldDescriptorProto,
156 json_value: &Value,
157) -> Result<u64, Status> {
158 if !json_value.is_f64() {
159 return Err(Status::error(format!(
160 "{} 类型错误!",
161 field.name.as_ref().unwrap()
162 )));
163 }
164 let value = json_value.as_f64().unwrap();
165 if value == 0.0 {
166 return Ok(0);
167 }
168 let tag = (field.number() << 3) | 1;
170 let tag_size = ::protobuf::rt::compute_raw_varint64_size(tag as u64);
171
172 return Ok(tag_size + 8);
173}
174
175fn compute_double_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
176 let mut size = 0;
177 if is_array(field) {
178 if !json_value.is_array() {
179 return Err(Status::error(format!(
180 "{} 类型错误, 应为数组!",
181 field.name.as_ref().unwrap()
182 )));
183 }
184 for ele in json_value.as_array().unwrap() {
185 size += compute_one_double_size(field, ele)?;
186 }
187 Ok(size)
188 } else {
189 compute_one_double_size(field, json_value)
190 }
191}
192
193fn write_one_double(
195 field: &FieldDescriptorProto,
196 json_value: &Value,
197 output_stream: &mut CodedOutputStream,
198) -> Result<(), Status> {
199 let number = field.number.unwrap() as u32;
200 let value = json_value.as_f64().unwrap();
201 if value == 0.0 {
202 return Ok(());
203 }
204 let result = output_stream.write_double(number, value);
205 if result.is_err() {
206 return Err(Status::error(format!(
207 "{} 序列化失败!",
208 field.name.as_ref().unwrap()
209 )));
210 }
211 Ok(())
212}
213
214fn write_double(
216 field: &FieldDescriptorProto,
217 json_value: &Value,
218 output_stream: &mut CodedOutputStream,
219) -> Result<(), Status> {
220 if is_array(field) {
221 for ele in json_value.as_array().unwrap() {
222 write_one_double(field, ele, output_stream)?;
223 }
224 Ok(())
225 } else {
226 write_one_double(field, json_value, output_stream)
227 }
228}
229
230fn compute_one_sint64_size(
231 field: &FieldDescriptorProto,
232 json_value: &Value,
233) -> Result<u64, Status> {
234 let number = field.number.unwrap() as u32;
235 if !json_value.is_i64() {
236 return Err(Status::error(format!(
237 "{} 类型错误!",
238 field.name.as_ref().unwrap()
239 )));
240 }
241 let value = json_value.as_i64().unwrap();
242 if value == 0 {
243 return Ok(0);
244 }
245 return Ok(protobuf::rt::sint64_size(number, value));
246}
247
248fn compute_sint64_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
249 let mut size = 0;
250
251 if is_array(field) {
252 if !json_value.is_array() {
253 return Err(Status::error(format!(
254 "{} 类型错误, 应为数组!",
255 field.name.as_ref().unwrap()
256 )));
257 }
258 for ele in json_value.as_array().unwrap() {
259 size += compute_one_sint64_size(field, ele)?;
260 }
261 Ok(size)
262 } else {
263 compute_one_sint64_size(field, json_value)
264 }
265}
266
267fn write_one_sint64(
269 field: &FieldDescriptorProto,
270 json_value: &Value,
271 output_stream: &mut CodedOutputStream,
272) -> Result<(), Status> {
273 let number = field.number.unwrap() as u32;
274 let value = json_value.as_i64().unwrap();
275 if value == 0 {
276 return Ok(());
277 }
278 let result = output_stream.write_sint64(number, value);
279 if result.is_err() {
280 return Err(Status::error(format!(
281 "{} 序列化失败!",
282 field.name.as_ref().unwrap()
283 )));
284 }
285 Ok(())
286}
287
288fn write_sint64(
290 field: &FieldDescriptorProto,
291 json_value: &Value,
292 output_stream: &mut CodedOutputStream,
293) -> Result<(), Status> {
294 if is_array(field) {
295 for ele in json_value.as_array().unwrap() {
296 write_one_sint64(field, ele, output_stream)?;
297 }
298 Ok(())
299 } else {
300 write_one_sint64(field, json_value, output_stream)
301 }
302}
303
304fn compute_one_sint32_size(
306 field: &FieldDescriptorProto,
307 json_value: &Value,
308) -> Result<u64, Status> {
309 let number = field.number.unwrap() as u32;
310 if !json_value.is_i64() {
311 return Err(Status::error(format!(
312 "{} 类型错误!",
313 field.name.as_ref().unwrap()
314 )));
315 }
316 let value = json_value.as_i64().unwrap();
317 if value == 0 {
318 return Ok(0);
319 }
320 return Ok(protobuf::rt::sint32_size(number, value as i32));
321}
322
323fn compute_sint32_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
324 let mut size = 0;
325 if is_array(field) {
326 if !json_value.is_array() {
327 return Err(Status::error(format!(
328 "{} 类型错误, 应为数组!",
329 field.name.as_ref().unwrap()
330 )));
331 }
332 for ele in json_value.as_array().unwrap() {
333 size += compute_one_sint32_size(field, ele)?;
334 }
335 Ok(size)
336 } else {
337 compute_one_sint32_size(field, json_value)
338 }
339}
340
341fn write_one_sint32(
343 field: &FieldDescriptorProto,
344 json_value: &Value,
345 output_stream: &mut CodedOutputStream,
346) -> Result<(), Status> {
347 let number = field.number.unwrap() as u32;
348 let value = json_value.as_i64().unwrap();
349 if value == 0 {
350 return Ok(());
351 }
352 let result = output_stream.write_sint32(number, value as i32);
353 if result.is_err() {
354 return Err(Status::error(format!(
355 "{} 序列化失败!",
356 field.name.as_ref().unwrap()
357 )));
358 }
359 Ok(())
360}
361
362fn write_sint32(
364 field: &FieldDescriptorProto,
365 json_value: &Value,
366 output_stream: &mut CodedOutputStream,
367) -> Result<(), Status> {
368 if is_array(field) {
369 for ele in json_value.as_array().unwrap() {
370 write_one_sint32(field, ele, output_stream)?;
371 }
372 Ok(())
373 } else {
374 write_one_sint32(field, json_value, output_stream)
375 }
376}
377
378fn compute_one_sfixed64_size(
380 field: &FieldDescriptorProto,
381 json_value: &Value,
382) -> Result<u64, Status> {
383 if !json_value.is_i64() {
384 return Err(Status::error(format!(
385 "{} 类型错误!",
386 field.name.as_ref().unwrap()
387 )));
388 }
389
390 let value = json_value.as_i64().unwrap();
391 if value == 0 {
392 return Ok(0);
393 }
394
395 let tag = (field.number() << 3) | 16;
397 let tag_size = ::protobuf::rt::compute_raw_varint64_size(tag as u64);
398
399 return Ok(tag_size + 8);
400}
401
402fn compute_sfixed64_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
403 let mut size = 0;
404 if is_array(field) {
405 if !json_value.is_array() {
406 return Err(Status::error(format!(
407 "{} 类型错误, 应为数组!",
408 field.name.as_ref().unwrap()
409 )));
410 }
411 for ele in json_value.as_array().unwrap() {
412 size += compute_one_sfixed64_size(field, ele)?;
413 }
414 Ok(size)
415 } else {
416 compute_one_sfixed64_size(field, json_value)
417 }
418}
419
420fn write_one_sfixed64(
422 field: &FieldDescriptorProto,
423 json_value: &Value,
424 output_stream: &mut CodedOutputStream,
425) -> Result<(), Status> {
426 let number = field.number.unwrap() as u32;
427 let value = json_value.as_i64().unwrap();
428 if value == 0 {
429 return Ok(());
430 }
431 let result = output_stream.write_sfixed64(number, value);
432 if result.is_err() {
433 return Err(Status::error(format!(
434 "{} 序列化失败!",
435 field.name.as_ref().unwrap()
436 )));
437 }
438 Ok(())
439}
440
441fn write_sfixed64(
443 field: &FieldDescriptorProto,
444 json_value: &Value,
445 output_stream: &mut CodedOutputStream,
446) -> Result<(), Status> {
447 if is_array(field) {
448 for ele in json_value.as_array().unwrap() {
449 write_one_sfixed64(field, ele, output_stream)?;
450 }
451 Ok(())
452 } else {
453 write_one_sfixed64(field, json_value, output_stream)
454 }
455}
456
457fn compute_one_sfixed32_size(
459 field: &FieldDescriptorProto,
460 json_value: &Value,
461) -> Result<u64, Status> {
462 if !json_value.is_i64() {
463 return Err(Status::error(format!(
464 "{} 类型错误!",
465 field.name.as_ref().unwrap()
466 )));
467 }
468 let value = json_value.as_i64().unwrap();
469 if value == 0 {
470 return Ok(0);
471 }
472
473 return Ok(::protobuf::rt::sint32_size(
474 field.number() as u32,
475 value as i32,
476 ));
477}
478
479fn compute_sfixed32_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
480 let mut size = 0;
481 if is_array(field) {
482 if !json_value.is_array() {
483 return Err(Status::error(format!(
484 "{} 类型错误, 应为数组!",
485 field.name.as_ref().unwrap()
486 )));
487 }
488 for ele in json_value.as_array().unwrap() {
489 size += compute_one_sfixed32_size(field, ele)?;
490 }
491 Ok(size)
492 } else {
493 compute_one_sfixed32_size(field, json_value)
494 }
495}
496
497fn write_one_sfixed32(
499 field: &FieldDescriptorProto,
500 json_value: &Value,
501 output_stream: &mut CodedOutputStream,
502) -> Result<(), Status> {
503 let number = field.number.unwrap() as u32;
504 let value = json_value.as_i64().unwrap();
505 if value == 0 {
506 return Ok(());
507 }
508 let result = output_stream.write_sfixed32(number, value as i32);
509 if result.is_err() {
510 return Err(Status::error(format!(
511 "{} 序列化失败!",
512 field.name.as_ref().unwrap()
513 )));
514 }
515 Ok(())
516}
517
518fn write_sfixed32(
520 field: &FieldDescriptorProto,
521 json_value: &Value,
522 output_stream: &mut CodedOutputStream,
523) -> Result<(), Status> {
524 if is_array(field) {
525 for ele in json_value.as_array().unwrap() {
526 write_one_sfixed32(field, ele, output_stream)?;
527 }
528 Ok(())
529 } else {
530 write_one_sfixed32(field, json_value, output_stream)
531 }
532}
533
534fn compute_one_enum_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
536 let number = field.number.unwrap() as u32;
537 if !json_value.is_i64() {
538 return Err(Status::error(format!(
539 "{} 类型错误!",
540 field.name.as_ref().unwrap()
541 )));
542 }
543 let value = json_value.as_i64().unwrap();
544 if value == 0 {
545 return Ok(0);
546 }
547 return Ok(protobuf::rt::int32_size(number, value as i32));
548}
549
550fn compute_enum_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
551 let mut size = 0;
552 if is_array(field) {
553 if !json_value.is_array() {
554 return Err(Status::error(format!(
555 "{} 类型错误, 应为数组!",
556 field.name.as_ref().unwrap()
557 )));
558 }
559 for ele in json_value.as_array().unwrap() {
560 size += compute_one_enum_size(field, ele)?;
561 }
562 Ok(size)
563 } else {
564 compute_one_enum_size(field, json_value)
565 }
566}
567
568fn write_one_enum(
570 field: &FieldDescriptorProto,
571 json_value: &Value,
572 output_stream: &mut CodedOutputStream,
573) -> Result<(), Status> {
574 let number = field.number.unwrap() as u32;
575 let value = json_value.as_i64().unwrap();
576 if value == 0 {
577 return Ok(());
578 }
579 let result = output_stream.write_enum(number, value as i32);
580 if result.is_err() {
581 return Err(Status::error(format!(
582 "{} 序列化失败!",
583 field.name.as_ref().unwrap()
584 )));
585 }
586 Ok(())
587}
588
589fn write_enum(
591 field: &FieldDescriptorProto,
592 json_value: &Value,
593 output_stream: &mut CodedOutputStream,
594) -> Result<(), Status> {
595 if is_array(field) {
596 for ele in json_value.as_array().unwrap() {
597 write_one_enum(field, ele, output_stream)?;
598 }
599 Ok(())
600 } else {
601 write_one_enum(field, json_value, output_stream)
602 }
603}
604
605fn compute_one_uint32_size(
606 field: &FieldDescriptorProto,
607 json_value: &Value,
608) -> Result<u64, Status> {
609 if !json_value.is_u64() {
610 return Err(Status::error(format!(
611 "{} 类型错误!",
612 field.name.as_ref().unwrap()
613 )));
614 }
615 let value = json_value.as_u64().unwrap();
616 if value == 0 {
617 return Ok(0);
618 }
619 let number = field.number.unwrap() as u32;
620 return Ok(protobuf::rt::uint32_size(number, value as u32));
621}
622
623fn compute_uint32_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
624 let mut size = 0;
625 if is_array(field) {
626 if !json_value.is_array() {
627 return Err(Status::error(format!(
628 "{} 类型错误, 应为数组!",
629 field.name.as_ref().unwrap()
630 )));
631 }
632 for ele in json_value.as_array().unwrap() {
633 size += compute_one_uint32_size(field, ele)?;
634 }
635 Ok(size)
636 } else {
637 compute_one_uint32_size(field, json_value)
638 }
639}
640
641fn write_one_uint32(
643 field: &FieldDescriptorProto,
644 json_value: &Value,
645 output_stream: &mut CodedOutputStream,
646) -> Result<(), Status> {
647 let value = json_value.as_u64().unwrap();
648 if value == 0 {
649 return Ok(());
650 }
651 let number = field.number.unwrap() as u32;
652 let result = output_stream.write_uint32(number, value as u32);
653 if result.is_err() {
654 return Err(Status::error(format!(
655 "{} 序列化失败!",
656 field.name.as_ref().unwrap()
657 )));
658 }
659 Ok(())
660}
661
662fn write_uint32(
664 field: &FieldDescriptorProto,
665 json_value: &Value,
666 output_stream: &mut CodedOutputStream,
667) -> Result<(), Status> {
668 if is_array(field) {
669 for ele in json_value.as_array().unwrap() {
670 write_one_uint32(field, ele, output_stream)?;
671 }
672 Ok(())
673 } else {
674 write_one_uint32(field, json_value, output_stream)
675 }
676}
677fn compute_one_fixed32_size(
680 field: &FieldDescriptorProto,
681 json_value: &Value,
682) -> Result<u64, Status> {
683 if !json_value.is_u64() {
684 return Err(Status::error(format!(
685 "{} 类型错误!",
686 field.name.as_ref().unwrap()
687 )));
688 }
689 let value = json_value.as_u64().unwrap();
690 if value == 0 {
691 return Ok(0);
692 }
693
694 let tag = (field.number() << 3) | 7;
696 let tag_size = ::protobuf::rt::compute_raw_varint64_size(tag as u64);
697 return Ok(tag_size + 4);
698}
699
700fn compute_fixed32_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
701 let mut size = 0;
702 if is_array(field) {
703 if !json_value.is_array() {
704 return Err(Status::error(format!(
705 "{} 类型错误, 应为数组!",
706 field.name.as_ref().unwrap()
707 )));
708 }
709 for ele in json_value.as_array().unwrap() {
710 size += compute_one_fixed32_size(field, ele)?;
711 }
712 Ok(size)
713 } else {
714 compute_one_fixed32_size(field, json_value)
715 }
716}
717
718fn write_one_fixed32(
721 field: &FieldDescriptorProto,
722 json_value: &Value,
723 output_stream: &mut CodedOutputStream,
724) -> Result<(), Status> {
725 let number = field.number.unwrap() as u32;
726 let value = json_value.as_u64().unwrap();
727 if value == 0 {
728 return Ok(());
729 }
730 let result = output_stream.write_fixed32(number, value as u32);
731 if result.is_err() {
732 return Err(Status::error(format!(
733 "{} 序列化失败!",
734 field.name.as_ref().unwrap()
735 )));
736 }
737 Ok(())
738}
739fn write_fixed32(
743 field: &FieldDescriptorProto,
744 json_value: &Value,
745 output_stream: &mut CodedOutputStream,
746) -> Result<(), Status> {
747 if is_array(field) {
748 for ele in json_value.as_array().unwrap() {
749 write_one_fixed32(field, ele, output_stream)?;
750 }
751 Ok(())
752 } else {
753 write_one_fixed32(field, json_value, output_stream)
754 }
755}
756
757fn write_one_fixed64(
759 field: &FieldDescriptorProto,
760 json_value: &Value,
761 output_stream: &mut CodedOutputStream,
762) -> Result<(), Status> {
763 let number = field.number.unwrap() as u32;
764
765 let value = json_value.as_u64().unwrap();
766 if value == 0 {
767 return Ok(());
768 }
769 let result = output_stream.write_fixed64(number, value);
770 if result.is_err() {
771 return Err(Status::error(format!(
772 "{} 序列化失败!",
773 field.name.as_ref().unwrap()
774 )));
775 }
776 Ok(())
777}
778
779fn compute_one_fixed64_size(
780 field: &FieldDescriptorProto,
781 json_value: &Value,
782) -> Result<u64, Status> {
783 if !json_value.is_u64() {
784 return Err(Status::error(format!(
785 "{} 类型错误!",
786 field.name.as_ref().unwrap()
787 )));
788 }
789 let value = json_value.as_u64().unwrap();
790 if value == 0 {
791 return Ok(0);
792 }
793 let tag = (field.number() << 3) | 6;
795 let tag_size = ::protobuf::rt::compute_raw_varint64_size(tag as u64);
796 return Ok(tag_size + 8);
797}
798
799fn compute_fixed64_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
800 let mut size = 0;
801 if is_array(field) {
802 if !json_value.is_array() {
803 return Err(Status::error(format!(
804 "{} 类型错误, 应为数组!",
805 field.name.as_ref().unwrap()
806 )));
807 }
808 for ele in json_value.as_array().unwrap() {
809 size += compute_one_fixed64_size(field, ele)?;
810 }
811 Ok(size)
812 } else {
813 compute_one_fixed64_size(field, json_value)
814 }
815}
816
817fn write_fixed64(
819 field: &FieldDescriptorProto,
820 json_value: &Value,
821 output_stream: &mut CodedOutputStream,
822) -> Result<(), Status> {
823 if is_array(field) {
824 for ele in json_value.as_array().unwrap() {
825 write_one_fixed64(field, ele, output_stream)?;
826 }
827 Ok(())
828 } else {
829 write_one_fixed64(field, json_value, output_stream)
830 }
831}
832
833fn compute_one_int32_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
835 let number = field.number.unwrap() as u32;
836 if !json_value.is_i64() {
837 return Err(Status::error(format!(
838 "{} 类型错误!",
839 field.name.as_ref().unwrap()
840 )));
841 }
842 let value = json_value.as_i64().unwrap();
843 if value == 0 {
844 return Ok(0);
845 }
846 return Ok(protobuf::rt::int32_size(number, value as i32));
847}
848
849fn compute_int32_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
850 let mut size = 0;
851 if is_array(field) {
852 if !json_value.is_array() {
853 return Err(Status::error(format!(
854 "{} 类型错误, 应为数组!",
855 field.name.as_ref().unwrap()
856 )));
857 }
858 for ele in json_value.as_array().unwrap() {
859 size += compute_one_int32_size(field, ele)?;
860 }
861 Ok(size)
862 } else {
863 compute_one_int32_size(field, json_value)
864 }
865}
866
867fn write_one_int32(
869 field: &FieldDescriptorProto,
870 json_value: &Value,
871 output_stream: &mut CodedOutputStream,
872) -> Result<(), Status> {
873 let number = field.number.unwrap() as u32;
874 let value = json_value.as_i64().unwrap();
875 if value == 0 {
876 return Ok(());
877 }
878 let result = output_stream.write_int32(number, value as i32);
879 if result.is_err() {
880 return Err(Status::error(format!(
881 "{} 序列化失败!",
882 field.name.as_ref().unwrap()
883 )));
884 }
885 Ok(())
886}
887
888fn write_int32(
890 field: &FieldDescriptorProto,
891 json_value: &Value,
892 output_stream: &mut CodedOutputStream,
893) -> Result<(), Status> {
894 if is_array(field) {
895 for ele in json_value.as_array().unwrap() {
896 write_one_int32(field, ele, output_stream)?;
897 }
898 Ok(())
899 } else {
900 write_one_int32(field, json_value, output_stream)
901 }
902}
903
904fn compute_one_uint64_size(
905 field: &FieldDescriptorProto,
906 json_value: &Value,
907) -> Result<u64, Status> {
908 let number = field.number.unwrap() as u32;
909 if !json_value.is_u64() {
910 return Err(Status::error(format!(
911 "{} 类型错误!",
912 field.name.as_ref().unwrap()
913 )));
914 }
915 let value = json_value.as_u64().unwrap();
916 if value == 0 {
917 return Ok(0);
918 }
919 return Ok(protobuf::rt::uint64_size(number, value));
920}
921
922fn compute_uint64_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
923 let mut size = 0;
924 if is_array(field) {
925 if !json_value.is_array() {
926 return Err(Status::error(format!(
927 "{} 类型错误, 应为数组!",
928 field.name.as_ref().unwrap()
929 )));
930 }
931 for ele in json_value.as_array().unwrap() {
932 size += compute_one_uint64_size(field, ele)?;
933 }
934 Ok(size)
935 } else {
936 compute_one_uint64_size(field, json_value)
937 }
938}
939
940fn write_one_uint64(
942 field: &FieldDescriptorProto,
943 json_value: &Value,
944 output_stream: &mut CodedOutputStream,
945) -> Result<(), Status> {
946 let number = field.number.unwrap() as u32;
947 let value = json_value.as_u64().unwrap();
948 if value == 0 {
949 return Ok(());
950 }
951 let result = output_stream.write_uint64(number, value);
952 if result.is_err() {
953 return Err(Status::error(format!(
954 "{} 序列化失败!",
955 field.name.as_ref().unwrap()
956 )));
957 }
958 Ok(())
959}
960
961fn write_uint64(
963 field: &FieldDescriptorProto,
964 json_value: &Value,
965 output_stream: &mut CodedOutputStream,
966) -> Result<(), Status> {
967 if is_array(field) {
968 for ele in json_value.as_array().unwrap() {
969 write_one_uint64(field, ele, output_stream)?;
970 }
971 Ok(())
972 } else {
973 write_one_uint64(field, json_value, output_stream)
974 }
975}
976fn compute_one_int64_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
979 let number = field.number.unwrap() as u32;
980 if !json_value.is_i64() {
981 return Err(Status::error(format!(
982 "{} 类型错误!",
983 field.name.as_ref().unwrap()
984 )));
985 }
986 let value = json_value.as_i64().unwrap();
987 if value == 0 {
988 return Ok(0);
989 }
990 return Ok(protobuf::rt::int64_size(number, value));
991}
992
993fn compute_int64_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
994 let mut size = 0;
995
996 if is_array(field) {
997 if !json_value.is_array() {
998 return Err(Status::error(format!(
999 "{} 类型错误, 应为数组!",
1000 field.name.as_ref().unwrap()
1001 )));
1002 }
1003 for ele in json_value.as_array().unwrap() {
1004 size += compute_one_int64_size(field, ele)?;
1005 }
1006 Ok(size)
1007 } else {
1008 compute_one_int64_size(field, json_value)
1009 }
1010}
1011
1012fn write_one_int64(
1014 field: &FieldDescriptorProto,
1015 json_value: &Value,
1016 output_stream: &mut CodedOutputStream,
1017) -> Result<(), Status> {
1018 let number = field.number.unwrap() as u32;
1019 let value = json_value.as_i64().unwrap();
1020 if value == 0 {
1021 return Ok(());
1022 }
1023 let result = output_stream.write_int64(number, value);
1024 if result.is_err() {
1025 return Err(Status::error(format!(
1026 "{} 序列化失败!",
1027 field.name.as_ref().unwrap()
1028 )));
1029 }
1030 Ok(())
1031}
1032
1033fn write_int64(
1035 field: &FieldDescriptorProto,
1036 json_value: &Value,
1037 output_stream: &mut CodedOutputStream,
1038) -> Result<(), Status> {
1039 if is_array(field) {
1040 for ele in json_value.as_array().unwrap() {
1041 write_one_int64(field, ele, output_stream)?;
1042 }
1043 Ok(())
1044 } else {
1045 write_one_int64(field, json_value, output_stream)
1046 }
1047}
1048
1049fn compute_one_string_size(
1052 field: &FieldDescriptorProto,
1053 json_value: &Value,
1054) -> Result<u64, Status> {
1055 let number = field.number.unwrap() as u32;
1056 if !json_value.is_string() {
1057 return Err(Status::error(format!(
1058 "{} 类型错误!",
1059 field.name.as_ref().unwrap()
1060 )));
1061 }
1062 let value = json_value.as_str().unwrap();
1063 if value.is_empty() {
1064 return Ok(0);
1065 }
1066 Ok(protobuf::rt::string_size(number, value))
1067}
1068
1069fn compute_string_size(field: &FieldDescriptorProto, json_value: &Value) -> Result<u64, Status> {
1071 let mut size = 0;
1072 if is_array(field) {
1073 if !json_value.is_array() {
1074 return Err(Status::error(format!(
1075 "{} 类型错误, 应为数组!",
1076 field.name.as_ref().unwrap()
1077 )));
1078 }
1079 for ele in json_value.as_array().unwrap() {
1080 size += compute_one_string_size(field, ele)?;
1081 }
1082 Ok(size)
1083 } else {
1084 compute_one_string_size(field, json_value)
1085 }
1086}
1087
1088fn write_one_string(
1089 field: &FieldDescriptorProto,
1090 json_value: &Value,
1091 output_stream: &mut CodedOutputStream,
1092) -> Result<(), Status> {
1093 let number = field.number.unwrap() as u32;
1094 let value = json_value.as_str().unwrap();
1095 if value.is_empty() {
1096 return Ok(());
1097 }
1098 let result = output_stream.write_string(number, value);
1099 if result.is_err() {
1100 return Err(Status::error(format!(
1101 "{} 序列化失败!",
1102 field.name.as_ref().unwrap()
1103 )));
1104 }
1105 Ok(())
1106}
1107
1108fn write_string(
1110 field: &FieldDescriptorProto,
1111 json_value: &Value,
1112 output_stream: &mut CodedOutputStream,
1113) -> Result<(), Status> {
1114 if is_array(field) {
1115 for ele in json_value.as_array().unwrap() {
1116 write_one_string(field, ele, output_stream)?;
1117 }
1118 Ok(())
1119 } else {
1120 write_one_string(field, json_value, output_stream)
1121 }
1122}
1123
1124fn compute_object_size(
1125 field: &FieldDescriptorProto,
1126 json_value: &Value,
1127 service_api_descriptor: &ServiceApiDescriptor,
1128) -> Result<u64, Status> {
1129 if field.type_name.is_none() {
1130 return Err(Status::error(format!(
1131 "{} 类型错误, 应为数组!",
1132 field.name.as_ref().unwrap()
1133 )));
1134 }
1135
1136 let type_name = field.type_name.as_ref().unwrap();
1137 let mut size = 0;
1138 if is_array(field) {
1139 if !json_value.is_array() {
1140 return Err(Status::error(format!(
1141 "{} 类型错误, 应为数组!",
1142 field.name.as_ref().unwrap()
1143 )));
1144 }
1145 for ele in json_value.as_array().unwrap() {
1146 let len = compute_size(ele, type_name, service_api_descriptor)?;
1147 size += 1 + protobuf::rt::compute_raw_varint64_size(len) + len;
1148 }
1149 } else {
1150 let len = compute_size(json_value, type_name, service_api_descriptor)?;
1151
1152 size = 1 + protobuf::rt::compute_raw_varint64_size(len) + len;
1153 }
1154 Ok(size)
1155}
1156
1157fn write_object(
1158 field: &FieldDescriptorProto,
1159 json_value: &Value,
1160 service_api_descriptor: &ServiceApiDescriptor,
1161 output_stream: &mut CodedOutputStream,
1162) -> Result<(), Status> {
1163 let type_name = field.type_name.as_ref().unwrap();
1164
1165 if is_array(field) {
1166 let number = field.number.unwrap() as u32;
1167 for ele in json_value.as_array().unwrap() {
1168 output_stream
1169 .write_tag(number, protobuf::rt::WireType::LengthDelimited)
1170 .unwrap();
1171 let len = compute_size(ele, type_name, service_api_descriptor)?;
1172 output_stream.write_raw_varint32(len as u32).unwrap();
1173
1174 json_to_proto_with_buffer(ele, type_name, service_api_descriptor, output_stream)?;
1175 }
1176 Ok(())
1177 } else {
1178 let number = field.number.unwrap() as u32;
1179 output_stream
1180 .write_tag(number, protobuf::rt::WireType::LengthDelimited)
1181 .unwrap();
1182 let len = compute_size(json_value, type_name, service_api_descriptor)?;
1183 output_stream.write_raw_varint32(len as u32).unwrap();
1184
1185 json_to_proto_with_buffer(json_value, type_name, service_api_descriptor, output_stream)
1186 }
1187}
1188
1189fn compute_json_key_size(field_type: Type, key: &str) -> Result<u64, Status> {
1190 match field_type {
1191 Type::TYPE_DOUBLE => Ok(2 + 8),
1192 Type::TYPE_FLOAT => Ok(2 + 4),
1193 Type::TYPE_INT64 => {
1194 let value: Result<i64, _> = key.parse();
1195 Ok(::protobuf::rt::int64_size(1, value.unwrap()))
1196 }
1197 Type::TYPE_UINT64 => {
1198 let value: Result<u64, _> = key.parse();
1199 Ok(::protobuf::rt::uint64_size(1, value.unwrap()))
1200 }
1201 Type::TYPE_INT32 => {
1202 let value: Result<i32, _> = key.parse();
1203 Ok(::protobuf::rt::int32_size(1, value.unwrap()))
1204 }
1205 Type::TYPE_FIXED64 => Ok(1 + 8),
1206 Type::TYPE_FIXED32 => Ok(1 + 4),
1207 Type::TYPE_BOOL => Ok(2 + 1),
1208 Type::TYPE_STRING => Ok(::protobuf::rt::string_size(1, key)),
1209 Type::TYPE_UINT32 => {
1210 let value: Result<u32, _> = key.parse();
1211 Ok(::protobuf::rt::uint32_size(1, value.unwrap()))
1212 }
1213 Type::TYPE_SFIXED32 => Ok(2 + 8),
1214 Type::TYPE_SFIXED64 => Ok(2 + 4),
1215 Type::TYPE_SINT32 => {
1216 let value: Result<i32, _> = key.parse();
1217 Ok(::protobuf::rt::sint32_size(1, value.unwrap()))
1218 }
1219 Type::TYPE_SINT64 => {
1220 let value: Result<i64, _> = key.parse();
1221 Ok(::protobuf::rt::sint64_size(1, value.unwrap()))
1222 }
1223 _ => {
1224 return Err(Status::error(format!("无消息 描述信息!")));
1225 }
1226 }
1227}
1228
1229fn compute_size_inner(
1230 field_type: Type,
1231 field: &FieldDescriptorProto,
1232 service_api_descriptor: &ServiceApiDescriptor,
1233 json_value: &Value,
1234) -> Result<u64, Status> {
1235 match field_type {
1237 Type::TYPE_INT64 => compute_int64_size(field, json_value),
1239 Type::TYPE_UINT64 => compute_uint64_size(field, json_value),
1241 Type::TYPE_INT32 => compute_int32_size(field, json_value),
1243 Type::TYPE_FIXED64 => compute_fixed64_size(field, json_value),
1245 Type::TYPE_FIXED32 => compute_fixed32_size(field, json_value),
1247 Type::TYPE_UINT32 => compute_uint32_size(field, json_value),
1249 Type::TYPE_ENUM => compute_enum_size(field, json_value),
1251 Type::TYPE_SFIXED32 => compute_sfixed32_size(field, json_value),
1253 Type::TYPE_SFIXED64 => compute_sfixed64_size(field, json_value),
1255 Type::TYPE_SINT32 => compute_sint32_size(field, json_value),
1257 Type::TYPE_SINT64 => compute_sint64_size(field, json_value),
1259 Type::TYPE_DOUBLE => compute_double_size(field, json_value),
1261 Type::TYPE_FLOAT => compute_float_size(field, json_value),
1263 Type::TYPE_STRING => compute_string_size(field, json_value),
1265 Type::TYPE_MESSAGE => compute_object_size(field, json_value, service_api_descriptor),
1267 Type::TYPE_BOOL => compute_bool_size(field, json_value),
1269 _ => {
1271 return Err(Status::error(format!("无消息 描述信息!")));
1272 }
1273 }
1274}
1275
1276pub fn compute_size(
1279 json_obj: &Value,
1280 msg_name: &str,
1281 service_api_descriptor: &ServiceApiDescriptor,
1282) -> Result<u64, Status> {
1283 let mut buffer_size = 0;
1284 let message_descriptor_holder = service_api_descriptor
1285 .message_descriptor_holder
1286 .get(msg_name);
1287
1288 if message_descriptor_holder.is_none() {
1289 return Err(Status::error(format!("无消息:{} 描述信息!", msg_name)));
1290 }
1291 let msg_descriptor = &message_descriptor_holder.unwrap().descriptor_proto;
1292
1293 for field in &msg_descriptor.field {
1294 let field_name = field.name.as_ref().unwrap();
1295 let json_value = json_obj.get(field_name);
1296 if json_value.is_none() {
1297 continue;
1298 }
1299
1300 let json_value = json_value.unwrap();
1301 let field_type = field.type_.unwrap().unwrap();
1302
1303 if field_type == Type::TYPE_MESSAGE && is_map(field, service_api_descriptor) {
1304 if !json_value.is_object() {
1305 return Err(Status::error(format!("{} 类型错误,应为 obj", msg_name)));
1306 }
1307
1308 let map_type_name = field.type_name.as_ref().unwrap();
1309
1310 let map_msg_descriptor_holder = service_api_descriptor
1311 .message_descriptor_holder
1312 .get(map_type_name);
1313
1314 let message_descriptor = &map_msg_descriptor_holder.unwrap().descriptor_proto;
1315
1316 let key_field = message_descriptor.field.get(0).unwrap();
1317
1318 let value_field = message_descriptor.field.get(1).unwrap();
1319
1320 let key_field_type = key_field.type_.unwrap().unwrap();
1321
1322 let value_field_type = value_field.type_.unwrap().unwrap();
1323 let obj_value = json_value.as_object().unwrap();
1326
1327 for (key, value) in obj_value {
1328 let mut entry_size = 0;
1329 entry_size += compute_json_key_size(key_field_type, key)?;
1330
1331 entry_size += compute_size_inner(
1332 value_field_type,
1333 value_field,
1334 service_api_descriptor,
1335 value,
1336 )?;
1337 buffer_size +=
1338 2 + ::protobuf::rt::compute_raw_varint64_size(entry_size) + entry_size;
1339 }
1340 } else {
1341 buffer_size +=
1342 compute_size_inner(field_type, field, service_api_descriptor, json_value)?;
1343 }
1344 }
1345
1346 Ok(buffer_size)
1347}
1348
1349fn write_json_key(
1350 field_type: Type,
1351 key: &str,
1352 output_stream: &mut CodedOutputStream,
1353) -> Result<(), Status> {
1354 match field_type {
1355 Type::TYPE_DOUBLE => {
1356 let value: Result<f64, _> = key.parse();
1357 output_stream.write_double(1, value.unwrap()).unwrap();
1358 }
1359 Type::TYPE_FLOAT => {
1360 let value: Result<f32, _> = key.parse();
1361 output_stream.write_float(1, value.unwrap()).unwrap();
1362 }
1363 Type::TYPE_INT64 => {
1364 let value: Result<i64, _> = key.parse();
1365 output_stream.write_int64(1, value.unwrap()).unwrap();
1366 }
1367 Type::TYPE_UINT64 => {
1368 let value: Result<u64, _> = key.parse();
1369 output_stream.write_uint64(1, value.unwrap()).unwrap();
1370 }
1371 Type::TYPE_INT32 => {
1372 let value: Result<i32, _> = key.parse();
1373 output_stream.write_int32(1, value.unwrap()).unwrap();
1374 }
1375 Type::TYPE_FIXED64 => {
1376 let value: Result<u64, _> = key.parse();
1377 output_stream.write_fixed64(1, value.unwrap()).unwrap();
1378 }
1379 Type::TYPE_FIXED32 => {
1380 let value: Result<u32, _> = key.parse();
1381 output_stream.write_fixed32(1, value.unwrap()).unwrap();
1382 }
1383 Type::TYPE_BOOL => {
1384 let value: Result<bool, _> = key.parse();
1385 output_stream.write_bool(1, value.unwrap()).unwrap();
1386 }
1387 Type::TYPE_STRING => {
1388 output_stream.write_string(1, key).unwrap();
1389 }
1390 Type::TYPE_UINT32 => {
1391 let value: Result<u32, _> = key.parse();
1392 output_stream.write_uint32(1, value.unwrap()).unwrap();
1393 }
1394 Type::TYPE_SFIXED32 => {
1395 let value: Result<i32, _> = key.parse();
1396 output_stream.write_sfixed32(1, value.unwrap()).unwrap();
1397 }
1398 Type::TYPE_SFIXED64 => {
1399 let value: Result<i64, _> = key.parse();
1400 output_stream.write_sfixed64(1, value.unwrap()).unwrap();
1401 }
1402 Type::TYPE_SINT32 => {
1403 let value: Result<i32, _> = key.parse();
1404 output_stream.write_sint32(1, value.unwrap()).unwrap();
1405 }
1406 Type::TYPE_SINT64 => {
1407 let value: Result<i64, _> = key.parse();
1408 output_stream.write_sint64(1, value.unwrap()).unwrap();
1409 }
1410 _ => {
1411 return Err(Status::error(format!("无消息 描述信息!")));
1412 }
1413 };
1414 Ok(())
1415}
1416
1417fn json_to_proto_with_buffer_inner(
1418 field_type: Type,
1419 field: &FieldDescriptorProto,
1420 json_value: &Value,
1421 service_api_descriptor: &ServiceApiDescriptor,
1422 output_stream: &mut CodedOutputStream,
1423) -> Result<(), Status> {
1424 match field_type {
1425 Type::TYPE_INT64 => write_int64(field, json_value, output_stream),
1427 Type::TYPE_UINT64 => write_uint64(field, json_value, output_stream),
1429 Type::TYPE_INT32 => write_int32(field, json_value, output_stream),
1431 Type::TYPE_FIXED64 => write_fixed64(field, json_value, output_stream),
1433 Type::TYPE_FIXED32 => write_fixed32(field, json_value, output_stream),
1435 Type::TYPE_UINT32 => write_uint32(field, json_value, output_stream),
1437 Type::TYPE_ENUM => write_enum(field, json_value, output_stream),
1439 Type::TYPE_SFIXED32 => write_sfixed32(field, json_value, output_stream),
1441 Type::TYPE_SFIXED64 => write_sfixed64(field, json_value, output_stream),
1443 Type::TYPE_SINT32 => write_sint32(field, json_value, output_stream),
1445 Type::TYPE_SINT64 => write_sint64(field, json_value, output_stream),
1447 Type::TYPE_DOUBLE => write_double(field, json_value, output_stream),
1449 Type::TYPE_FLOAT => write_float(field, json_value, output_stream),
1451 Type::TYPE_STRING => write_string(field, json_value, output_stream),
1453 Type::TYPE_MESSAGE => {
1455 write_object(field, json_value, service_api_descriptor, output_stream)
1456 }
1457 Type::TYPE_BOOL => write_bool(field, json_value, output_stream),
1459 _ => Err(Status::error("类型错误!".into())),
1461 }
1462}
1463
1464pub fn json_to_proto_with_buffer(
1465 json_obj: &Value,
1466 msg_name: &str,
1467 service_api_descriptor: &ServiceApiDescriptor,
1468 output_stream: &mut CodedOutputStream,
1469) -> Result<(), Status> {
1470 let msg_descriptor_holder = service_api_descriptor
1471 .message_descriptor_holder
1472 .get(msg_name);
1473
1474 let msg_descriptor = &msg_descriptor_holder.unwrap().descriptor_proto;
1475
1476 for field in &msg_descriptor.field {
1477 let field_name = field.name.as_ref().unwrap();
1478
1479 let json_value = json_obj.get(field_name);
1480
1481 if json_value.is_none() {
1482 continue;
1483 }
1484 let json_value = json_value.unwrap();
1485 let field_type = field.type_.unwrap().unwrap();
1486
1487 if field_type == Type::TYPE_MESSAGE && is_map(field, service_api_descriptor) {
1488 let map_type_name = field.type_name.as_ref().unwrap();
1489
1490 let map_msg_descriptor_holder = service_api_descriptor
1491 .message_descriptor_holder
1492 .get(map_type_name);
1493
1494 let message_descriptor = &map_msg_descriptor_holder.unwrap().descriptor_proto;
1495
1496 let key_field = message_descriptor.field.get(0).unwrap();
1497
1498 let value_field = message_descriptor.field.get(1).unwrap();
1499
1500 let key_field_type = key_field.type_.unwrap().unwrap();
1501
1502 let value_field_type = value_field.type_.unwrap().unwrap();
1503 let obj_value = json_value.as_object().unwrap();
1505
1506 let number = field.number() as u32;
1507
1508 let wire_type = get_wire_type(field);
1509
1510 let tag = make_tag(number, wire_type);
1511
1512 for (key, value) in obj_value {
1513 let mut entry_size = 0;
1514 entry_size += compute_json_key_size(key_field_type, key)?;
1515 entry_size += compute_size_inner(
1516 value_field_type,
1517 value_field,
1518 service_api_descriptor,
1519 value,
1520 )?;
1521 output_stream.write_raw_varint32(tag).unwrap();
1522 output_stream.write_raw_varint32(entry_size as u32).unwrap();
1523 write_json_key(key_field_type, key, output_stream)?;
1525
1526 json_to_proto_with_buffer_inner(
1528 value_field_type,
1529 value_field,
1530 value,
1531 service_api_descriptor,
1532 output_stream,
1533 )?
1534 }
1535 } else {
1536 json_to_proto_with_buffer_inner(
1537 field_type,
1538 field,
1539 json_value,
1540 service_api_descriptor,
1541 output_stream,
1542 )?
1543 }
1544 }
1545 Ok(())
1546}
1547
1548pub fn json_to_proto(
1549 json: &str,
1550 msg_name: &str,
1551 service_api_descriptor: &ServiceApiDescriptor,
1552) -> Result<Vec<u8>, Status> {
1553 let json_obj: Result<Value, _> = serde_json::from_str(json);
1554
1555 if json_obj.is_err() {
1556 return Err(Status::error(json_obj.err().unwrap().to_string()));
1557 }
1558 let json_obj = json_obj.as_ref().unwrap();
1559
1560 json_value_to_proto(json_obj, msg_name, service_api_descriptor)
1561}
1562
1563pub fn json_value_to_proto(
1564 json_value: &Value,
1565 msg_name: &str,
1566 service_api_descriptor: &ServiceApiDescriptor,
1567) -> Result<Vec<u8>, Status> {
1568 let buffer_size = compute_size(json_value, msg_name, service_api_descriptor)?;
1569 let mut buffer = Vec::with_capacity(buffer_size as usize);
1570
1571 let mut output_stream = CodedOutputStream::vec(&mut buffer);
1572
1573 json_to_proto_with_buffer(
1574 json_value,
1575 msg_name,
1576 service_api_descriptor,
1577 &mut output_stream,
1578 )?;
1579
1580 let flush_result = output_stream.flush();
1581
1582 if flush_result.is_err() {
1583 return Err(Status::error(flush_result.err().unwrap().to_string()));
1584 }
1585 drop(output_stream);
1586
1587 Ok(buffer)
1588}