1use std::io::Cursor;
18
19use anyhow::anyhow;
20use anyhow::bail;
21use anyhow::Context;
22use anyhow::Result;
23use bufsize::SizeCounter;
24use bytes::buf::Writer;
25use bytes::Buf;
26use bytes::BufMut;
27use bytes::Bytes;
28use bytes::BytesMut;
29use ghost::phantom;
30use serde_json::ser::CompactFormatter;
31use serde_json::ser::Formatter;
32
33use crate::binary_type::CopyFromBuf;
34use crate::bufext::BufExt;
35use crate::bufext::BufMutExt;
36use crate::bufext::DeserializeSource;
37use crate::deserialize::Deserialize;
38use crate::errors::ProtocolError;
39use crate::framing::Framing;
40use crate::protocol::should_break;
41use crate::protocol::Field;
42use crate::protocol::Protocol;
43use crate::protocol::ProtocolReader;
44use crate::protocol::ProtocolWriter;
45use crate::protocol::DEFAULT_RECURSION_DEPTH;
46use crate::serialize::Serialize;
47use crate::thrift_protocol::MessageType;
48use crate::thrift_protocol::ProtocolID;
49use crate::ttype::TType;
50
51#[phantom]
52#[derive(Copy, Clone)]
53pub struct SimpleJsonProtocol<F = Bytes>;
54
55pub struct SimpleJsonProtocolSerializer<B: BufMutExt> {
56 buffer: Writer<B>,
57 state: Vec<SerializationState>,
58}
59
60pub struct SimpleJsonProtocolDeserializer<B> {
61 buffer: B,
62 remaining: usize,
63}
64
65impl<F> Protocol for SimpleJsonProtocol<F>
66where
67 F: Framing + 'static,
68{
69 type Frame = F;
70 type Sizer = SimpleJsonProtocolSerializer<SizeCounter>;
71 type Serializer = SimpleJsonProtocolSerializer<F::EncBuf>;
72 type Deserializer = SimpleJsonProtocolDeserializer<F::DecBuf>;
73
74 const PROTOCOL_ID: ProtocolID = ProtocolID::SimpleJSONProtocol;
75
76 fn serializer<SZ, SER>(size: SZ, ser: SER) -> <Self::Serializer as ProtocolWriter>::Final
77 where
78 SZ: FnOnce(&mut Self::Sizer),
79 SER: FnOnce(&mut Self::Serializer),
80 {
81 let mut sizer = SimpleJsonProtocolSerializer {
83 buffer: SizeCounter::new().writer(),
84 state: vec![SerializationState::NotInContainer],
85 };
86 size(&mut sizer);
87 let sz = sizer.finish();
88
89 let mut buf = SimpleJsonProtocolSerializer {
91 buffer: F::enc_with_capacity(sz).writer(),
92 state: vec![SerializationState::NotInContainer],
93 };
94 ser(&mut buf);
95
96 buf.finish()
98 }
99
100 fn deserializer(buf: F::DecBuf) -> Self::Deserializer {
101 SimpleJsonProtocolDeserializer::new(buf)
102 }
103
104 fn into_buffer(deser: Self::Deserializer) -> F::DecBuf {
105 deser.into_inner()
106 }
107}
108
109impl<B: BufMutExt> SimpleJsonProtocolSerializer<B> {
110 fn possibly_write_comma(&mut self) {
111 match self
112 .state
113 .last()
114 .expect("Invariant of encoding state violated")
115 {
116 SerializationState::JustEnteredContainer => {
117 CompactFormatter
118 .begin_object_key(&mut self.buffer, true)
119 .expect("Somehow failed to do \"io\" on a buffer");
120 *self
121 .state
122 .last_mut()
123 .expect("Invariant of encoding state violated") =
124 SerializationState::InContainerValue;
125 }
126 SerializationState::InContainerKey
127 | SerializationState::InContainerValue
128 | SerializationState::NotInContainer => CompactFormatter
129 .begin_object_key(&mut self.buffer, false)
130 .expect("Somehow failed to do \"io\" on a buffer"),
131 }
132 }
133
134 fn writing_key(&mut self) -> bool {
135 match self
136 .state
137 .last()
138 .expect("Invariant of encoding state violated")
139 {
140 SerializationState::InContainerKey => true,
141 _ => false,
142 }
143 }
144}
145
146#[derive(Debug)]
147enum SerializationState {
148 JustEnteredContainer,
149 InContainerKey,
150 InContainerValue,
151 NotInContainer,
152}
153
154impl<B: BufMutExt> ProtocolWriter for SimpleJsonProtocolSerializer<B> {
155 type Final = B::Final; fn write_message_begin(&mut self, name: &str, msgtype: MessageType, seqid: u32) {
159 self.write_list_begin(TType::Stop, 0);
160 self.write_list_value_begin();
161 self.write_string(name);
162 self.write_list_value_begin();
163 self.write_byte(msgtype as i8);
164 self.write_list_value_begin();
165 self.write_i32(seqid as i32);
166 }
167
168 #[inline]
169 fn write_message_end(&mut self) {
170 self.write_list_end();
171 }
172
173 #[inline]
174 fn write_struct_begin(&mut self, _name: &str) {
175 CompactFormatter
176 .begin_object(&mut self.buffer)
177 .expect("Somehow failed to do \"io\" on a buffer");
178 self.state.push(SerializationState::JustEnteredContainer);
179 }
180
181 #[inline]
182 fn write_struct_end(&mut self) {
183 CompactFormatter
184 .end_object(&mut self.buffer)
185 .expect("Somehow failed to do \"io\" on a buffer");
186 self.state.pop();
187 }
188
189 #[inline]
190 fn write_field_begin(&mut self, name: &str, _type_id: TType, _id: i16) {
191 self.possibly_write_comma();
192 self.write_string(name);
193 CompactFormatter
194 .end_object_key(&mut self.buffer)
195 .expect("Somehow failed to do \"io\" on a buffer");
196 CompactFormatter
197 .begin_object_value(&mut self.buffer)
198 .expect("Somehow failed to do \"io\" on a buffer");
199 }
200
201 #[inline]
202 fn write_field_end(&mut self) {}
203
204 #[inline]
205 fn write_field_stop(&mut self) {}
206
207 fn write_map_begin(&mut self, _key_type: TType, _value_type: TType, _size: usize) {
208 self.state.push(SerializationState::JustEnteredContainer);
209 CompactFormatter
210 .begin_object(&mut self.buffer)
211 .expect("Somehow failed to do \"io\" on a buffer");
212 }
213
214 fn write_map_key_begin(&mut self) {
215 self.possibly_write_comma();
216 *self
217 .state
218 .last_mut()
219 .expect("Invariant of encoding state violated") = SerializationState::InContainerKey;
220 }
221
222 fn write_map_value_begin(&mut self) {
223 CompactFormatter
224 .end_object_key(&mut self.buffer)
225 .expect("Somehow failed to do \"io\" on a buffer");
226 CompactFormatter
227 .begin_object_value(&mut self.buffer)
228 .expect("Somehow failed to do \"io\" on a buffer");
229 *self
230 .state
231 .last_mut()
232 .expect("Invariant of encoding state violated") = SerializationState::InContainerValue;
233 }
234
235 #[inline]
236 fn write_map_end(&mut self) {
237 CompactFormatter
238 .end_object(&mut self.buffer)
239 .expect("Somehow failed to do \"io\" on a buffer");
240 self.state.pop();
241 }
242
243 fn write_list_begin(&mut self, _elem_type: TType, _size: usize) {
244 CompactFormatter
245 .begin_array(&mut self.buffer)
246 .expect("Somehow failed to do \"io\" on a buffer");
247 self.state.push(SerializationState::JustEnteredContainer);
248 }
249
250 fn write_list_value_begin(&mut self) {
251 self.possibly_write_comma();
252 }
253
254 #[inline]
255 fn write_list_end(&mut self) {
256 CompactFormatter
257 .end_array(&mut self.buffer)
258 .expect("Somehow failed to do \"io\" on a buffer");
259 self.state.pop();
260 }
261
262 fn write_set_begin(&mut self, elem_type: TType, size: usize) {
263 self.write_list_begin(elem_type, size);
264 }
265
266 fn write_set_value_begin(&mut self) {
267 self.write_list_value_begin();
268 }
269
270 fn write_set_end(&mut self) {
271 self.write_list_end();
272 }
273
274 fn write_bool(&mut self, value: bool) {
275 CompactFormatter
276 .write_bool(&mut self.buffer, value)
277 .expect("Somehow failed to do \"io\" on a buffer");
278 }
279
280 fn write_byte(&mut self, value: i8) {
281 if self.writing_key() {
282 self.write_string(&value.to_string());
283 return;
284 }
285 CompactFormatter
286 .write_i8(&mut self.buffer, value)
287 .expect("Somehow failed to do \"io\" on a buffer");
288 }
289
290 fn write_i16(&mut self, value: i16) {
291 if self.writing_key() {
292 self.write_string(&value.to_string());
293 return;
294 }
295 CompactFormatter
296 .write_i16(&mut self.buffer, value)
297 .expect("Somehow failed to do \"io\" on a buffer");
298 }
299
300 fn write_i32(&mut self, value: i32) {
301 if self.writing_key() {
302 self.write_string(&value.to_string());
303 return;
304 }
305 CompactFormatter
306 .write_i32(&mut self.buffer, value)
307 .expect("Somehow failed to do \"io\" on a buffer");
308 }
309
310 fn write_i64(&mut self, value: i64) {
311 if self.writing_key() {
312 self.write_string(&value.to_string());
313 return;
314 }
315 CompactFormatter
316 .write_i64(&mut self.buffer, value)
317 .expect("Somehow failed to do \"io\" on a buffer");
318 }
319
320 fn write_double(&mut self, value: f64) {
321 if self.writing_key() {
322 self.write_string(&value.to_string());
323 return;
324 }
325 CompactFormatter
326 .write_f64(&mut self.buffer, value)
327 .expect("Somehow failed to do \"io\" on a buffer");
328 }
329
330 fn write_float(&mut self, value: f32) {
331 if self.writing_key() {
332 self.write_string(&value.to_string());
333 return;
334 }
335 CompactFormatter
336 .write_f32(&mut self.buffer, value)
337 .expect("Somehow failed to do \"io\" on a buffer");
338 }
339
340 fn write_string(&mut self, value: &str) {
341 serde_json::to_writer(&mut self.buffer, value)
342 .expect("Somehow failed to do \"io\" on a buffer");
343 }
344
345 fn write_binary(&mut self, value: &[u8]) {
346 CompactFormatter
347 .begin_string(&mut self.buffer)
348 .expect("Somehow failed to do \"io\" on a buffer");
349 CompactFormatter
350 .write_raw_fragment(
351 &mut self.buffer,
352 &base64::encode_config(value, base64::STANDARD_NO_PAD),
353 )
354 .expect("Somehow failed to do \"io\" on a buffer");
355 CompactFormatter
356 .end_string(&mut self.buffer)
357 .expect("Somehow failed to do \"io\" on a buffer");
358 }
359
360 fn finish(self) -> B::Final {
361 self.buffer.into_inner().finalize()
362 }
363}
364
365#[derive(Debug)]
366enum CommaState {
367 Trailing,
368 NonTrailing,
369 NoComma,
370 End,
371}
372
373impl<B: Buf> SimpleJsonProtocolDeserializer<B> {
374 pub fn new(buffer: B) -> Self {
375 let remaining = buffer.remaining();
376 SimpleJsonProtocolDeserializer { buffer, remaining }
377 }
378
379 pub fn into_inner(self) -> B {
380 self.buffer
381 }
382
383 pub fn peek(&self) -> Option<u8> {
388 if !self.buffer.chunk().is_empty() {
390 Some(self.buffer.chunk()[0])
391 } else {
392 None
393 }
394 }
395
396 fn peek_can_panic(&self) -> u8 {
398 self.buffer.chunk()[0]
399 }
400
401 fn strip_whitespace(&mut self) {
402 while let Some(b) = self.peek() {
403 if !&[b' ', b'\t', b'\n', b'\r'].contains(&b) {
404 break;
405 }
406 self.advance(1);
407 }
408 }
409 fn eat_only(&mut self, val: &[u8]) -> Result<()> {
411 if self.remaining < val.len() {
412 bail!(
413 "Expected the following chars: {:?}, not enough bytes remaining",
414 String::from_utf8_lossy(val)
415 )
416 }
417
418 for to_check in val {
419 let b = self.peek_can_panic();
420 if b != *to_check {
421 bail!("Expected {} got {}", to_check, b)
423 }
424 self.advance(1);
425 }
426 Ok(())
427 }
428
429 fn eat(&mut self, val: &[u8]) -> Result<()> {
431 self.strip_whitespace();
432 self.eat_only(val)?;
433 self.strip_whitespace();
434 Ok(())
435 }
436
437 fn advance(&mut self, len: usize) {
438 self.buffer.advance(len);
439
440 self.remaining -= len
442 }
443
444 fn possibly_read_comma(&mut self, trailing: u8) -> CommaState {
451 match self.eat(b",") {
452 Ok(()) => match self.peek() {
453 Some(b) if b == trailing => CommaState::Trailing,
454 _ => CommaState::NonTrailing,
455 },
456 _ => match self.peek() {
457 Some(b) if b == trailing => CommaState::End,
458 _ => CommaState::NoComma,
459 },
460 }
461 }
462
463 fn read_json_number(&mut self) -> Result<serde_json::Number> {
464 self.strip_whitespace();
465 let mut ret = Vec::new();
466
467 let as_string = match self.peek() {
468 Some(b'"') => {
469 self.advance(1);
470 true
471 }
472 _ => false,
473 };
474
475 while let Some(b) = self.peek() {
476 match b {
477 b' ' | b'\t' | b'\n' | b'\r' | b'}' | b']' | b',' | b':' | b'"' => {
478 if as_string && b == b'"' {
479 self.advance(1);
480 }
481 break;
482 }
483 _ => {
484 ret.push(b);
485 self.advance(1);
486 }
487 }
488 }
489
490 let v: std::result::Result<serde_json::Value, _> = serde_json::from_slice(&ret);
491 match v {
492 Ok(serde_json::Value::Number(n)) => Ok(n),
493 _ => bail!("invalid number"),
494 }
495 }
496
497 fn read_json_value(&mut self, max_depth: i32) -> Result<serde_json::Value> {
498 if max_depth <= 0 {
499 bail_err!(ProtocolError::SkipDepthExceeded)
500 }
501
502 self.strip_whitespace();
503 match self.guess_kind()? {
504 ValueKind::Null => {
505 self.read_null()?;
506 Ok(serde_json::Value::Null)
507 }
508 ValueKind::Bool => {
509 let value = self.read_bool()?;
510 Ok(serde_json::Value::Bool(value))
511 }
512 ValueKind::Number => {
513 let value = self.read_json_number()?;
514 Ok(serde_json::Value::Number(value))
515 }
516 ValueKind::String => {
517 let value = self.read_string()?;
518 Ok(serde_json::Value::String(value))
519 }
520 ValueKind::Array => {
521 let mut vec = Vec::new();
522 self.read_list_begin()?;
523 while self.read_list_value_begin()? {
524 let element = self.read_json_value(max_depth - 1)?;
525 vec.push(element);
526 self.read_list_value_end()?;
527 }
528 self.read_list_end()?;
529 Ok(serde_json::Value::Array(vec))
530 }
531 ValueKind::Object => {
532 let mut map = serde_json::Map::new();
533 self.read_struct_begin(|_| ())?;
534 while let Some(b'"') = self.peek() {
535 let key = self.read_string()?;
536 self.eat(b":")?;
537 let value = self.read_json_value(max_depth - 1)?;
538 map.insert(key, value);
539 self.read_field_end()?;
540 }
541 self.read_struct_end()?;
542 Ok(serde_json::Value::Object(map))
543 }
544 }
545 }
546
547 fn skip_inner(&mut self, field_type: TType, max_depth: i32) -> Result<()> {
548 if max_depth <= 0 {
549 bail_err!(ProtocolError::SkipDepthExceeded)
550 }
551
552 match field_type {
553 TType::Void => {
554 self.read_null()?;
555 }
556 TType::Bool => {
557 self.read_bool()?;
558 }
559 TType::Byte => {
560 self.read_byte()?;
561 }
562 TType::I16 => {
563 self.read_i16()?;
564 }
565 TType::I32 => {
566 self.read_i32()?;
567 }
568 TType::I64 => {
569 self.read_i64()?;
570 }
571 TType::Double => {
572 self.read_double()?;
573 }
574 TType::Float => {
575 self.read_float()?;
576 }
577 TType::Map => bail_err!(ProtocolError::InvalidTypeInSkip(field_type)),
578 TType::Set => bail_err!(ProtocolError::InvalidTypeInSkip(field_type)),
579 TType::Struct => {
580 self.read_struct_begin(|_| ())?;
581 loop {
582 let fields = &[];
583 let (_, type_id, _) = self.read_field_begin(|_| (), fields)?;
584 if type_id == TType::Stop {
585 break;
586 }
587 self.skip_inner(type_id, max_depth - 1)?;
588 self.read_field_end()?;
589 }
590 self.read_struct_end()?;
591 }
592 TType::List => {
593 let (_, len) = self.read_list_begin()?;
594 let mut idx = 0;
595 loop {
596 let more = self.read_list_value_begin()?;
597 if should_break(len, more, idx + 1) {
598 break;
599 }
600
601 let elem_type = self.guess_type()?;
602 self.skip_inner(elem_type, max_depth - 1)?;
603 self.read_list_value_end()?;
604
605 idx += 1;
606 }
607 self.read_list_end()?;
608 }
609 TType::UTF8 => {
610 self.read_string()?;
611 }
612 TType::UTF16 => {
613 self.read_string()?;
614 }
615 TType::String => {
616 self.read_binary::<Vec<u8>>()?;
617 }
618 TType::Stream => bail_err!(ProtocolError::StreamUnsupported),
619 TType::Stop => bail_err!(ProtocolError::UnexpectedStopInSkip),
620 };
621 Ok(())
622 }
623
624 fn guess_type(&mut self) -> Result<TType> {
627 match self.guess_kind()? {
628 ValueKind::Object => Ok(TType::Struct),
629 ValueKind::Array => Ok(TType::List),
630 ValueKind::String => Ok(TType::UTF8),
631 ValueKind::Null => Ok(TType::Void),
632 ValueKind::Bool => Ok(TType::Bool),
633 ValueKind::Number => Ok(TType::Double),
634 }
635 }
636
637 fn guess_kind(&mut self) -> Result<ValueKind> {
638 match self.peek() {
639 Some(b'{') => Ok(ValueKind::Object),
640 Some(b'[') => Ok(ValueKind::Array),
641 Some(b'"') => Ok(ValueKind::String),
642 Some(b'n') => Ok(ValueKind::Null),
643 Some(b't') | Some(b'f') => Ok(ValueKind::Bool),
644 Some(b'-') => Ok(ValueKind::Number),
645 Some(b) if (b as char).is_ascii_digit() => Ok(ValueKind::Number),
646 ch => bail!(
647 "Expected [, {{, or \", or number after {:?}",
648 ch.map(|a| a as char)
649 ),
650 }
651 }
652
653 fn read_null(&mut self) -> Result<()> {
654 self.eat(b"null")
655 }
656
657 fn check_null(&mut self) -> bool {
658 self.strip_whitespace();
659 match self.peek() {
660 Some(b'n') => true,
661 _ => false,
662 }
663 }
664}
665
666impl<B: Buf> ProtocolReader for SimpleJsonProtocolDeserializer<B> {
667 fn read_message_begin<F, T>(&mut self, _msgfn: F) -> Result<(T, MessageType, u32)>
668 where
669 F: FnOnce(&[u8]) -> T,
670 {
671 bail!("Not implemented")
672 }
673
674 fn read_message_end(&mut self) -> Result<()> {
675 bail!("Not implemented")
676 }
677
678 fn read_struct_begin<F, T>(&mut self, namefn: F) -> Result<T>
679 where
680 F: FnOnce(&[u8]) -> T,
681 {
682 self.eat(b"{")?;
683 Ok(namefn(&[]))
684 }
685
686 fn read_struct_end(&mut self) -> Result<()> {
687 self.eat(b"}")?;
688 Ok(())
689 }
690
691 fn read_field_begin<F, T>(&mut self, fieldfn: F, fields: &[Field]) -> Result<(T, TType, i16)>
692 where
693 F: FnOnce(&[u8]) -> T,
694 {
695 self.strip_whitespace();
697 match self.peek() {
698 Some(b'"') => {}
699 _ => return Ok((fieldfn(&[]), TType::Stop, -1)),
700 }
701
702 let field_name = self.read_string()?;
704 self.eat(b":")?;
705
706 if let Ok(idx) = fields.binary_search_by_key(&field_name.as_str(), |f| f.name) {
708 let field = &fields[idx];
709 if !self.check_null() {
710 return Ok((fieldfn(field.name.as_bytes()), field.ttype, field.id));
711 }
712 }
713
714 let elem_type = self.guess_type()?;
715
716 Ok((fieldfn(field_name.as_bytes()), elem_type, -1))
718 }
719
720 fn read_field_end(&mut self) -> Result<()> {
721 match self.possibly_read_comma(b'}') {
722 CommaState::Trailing => bail!("Found trailing comma"),
723 CommaState::NoComma => bail!("Missing comma between fields"),
724 _ => {}
725 }
726 Ok(())
727 }
728
729 fn read_map_begin(&mut self) -> Result<(TType, TType, Option<usize>)> {
730 self.eat(b"{")?;
731 Ok((TType::Stop, TType::Stop, None))
733 }
734
735 fn read_map_key_begin(&mut self) -> Result<bool> {
736 self.strip_whitespace();
737 match self.peek() {
738 Some(b'}') => {
739 return Ok(false);
741 }
742 _ => {}
743 }
744 Ok(true)
745 }
746
747 fn read_map_value_begin(&mut self) -> Result<()> {
748 self.eat(b":")?;
749 Ok(())
750 }
751
752 #[inline]
753 fn read_map_value_end(&mut self) -> Result<()> {
754 match self.possibly_read_comma(b'}') {
755 CommaState::Trailing => bail!("Found trailing comma"),
756 CommaState::NoComma => bail!("Missing comma between fields"),
757 _ => {}
758 }
759 Ok(())
760 }
761
762 fn read_map_end(&mut self) -> Result<()> {
763 self.eat(b"}")?;
764 Ok(())
765 }
766
767 fn read_list_begin(&mut self) -> Result<(TType, Option<usize>)> {
768 self.eat(b"[")?;
769 Ok((TType::Stop, None))
770 }
771
772 fn read_list_value_begin(&mut self) -> Result<bool> {
773 match self.peek() {
774 Some(b']') => return Ok(false),
775 _ => {}
776 }
777 Ok(true)
778 }
779
780 #[inline]
781 fn read_list_value_end(&mut self) -> Result<()> {
782 match self.possibly_read_comma(b']') {
783 CommaState::Trailing => bail!("Found trailing comma"),
784 CommaState::NoComma => bail!("Missing comma between fields"),
785 _ => {}
786 }
787 Ok(())
788 }
789
790 fn read_list_end(&mut self) -> Result<()> {
791 self.eat(b"]")?;
792 Ok(())
793 }
794
795 fn read_set_begin(&mut self) -> Result<(TType, Option<usize>)> {
796 self.read_list_begin()
797 }
798
799 fn read_set_value_begin(&mut self) -> Result<bool> {
800 self.read_list_value_begin()
801 }
802
803 #[inline]
804 fn read_set_value_end(&mut self) -> Result<()> {
805 self.read_list_value_end()
806 }
807
808 fn read_set_end(&mut self) -> Result<()> {
809 self.read_list_end()
810 }
811
812 fn read_bool(&mut self) -> Result<bool> {
813 match self.eat(b"true") {
814 Ok(_) => Ok(true),
815 Err(_) => match self.eat(b"false") {
816 Ok(_) => Ok(false),
817 Err(_) => bail!("Expected `true` or `false`"),
818 },
819 }
820 }
821
822 fn read_byte(&mut self) -> Result<i8> {
823 Ok(self.read_i64()? as i8)
824 }
825
826 fn read_i16(&mut self) -> Result<i16> {
827 Ok(self.read_i64()? as i16)
828 }
829
830 fn read_i32(&mut self) -> Result<i32> {
831 Ok(self.read_i64()? as i32)
832 }
833
834 fn read_i64(&mut self) -> Result<i64> {
835 self.read_json_number()?
836 .as_i64()
837 .ok_or_else(|| anyhow!("Invalid number"))
838 }
839
840 fn read_double(&mut self) -> Result<f64> {
841 self.read_json_number()?
842 .as_f64()
843 .ok_or_else(|| anyhow!("Invalid number"))
844 }
845
846 fn read_float(&mut self) -> Result<f32> {
847 Ok(self.read_double()? as f32)
848 }
849
850 fn read_string(&mut self) -> Result<String> {
851 self.strip_whitespace();
852 self.eat_only(b"\"")?;
853 let mut ret = Vec::new();
854 ret.push(b'"');
855 loop {
856 match self.peek() {
857 Some(b'"') => {
858 self.advance(1);
859 break;
860 }
861 Some(b'\\') => {
862 self.advance(1);
863 ret.push(b'\\');
864 match self.peek() {
865 Some(b'"') => {
866 self.advance(1);
867 ret.push(b'"')
868 }
869 Some(b'\\') => {
870 self.advance(1);
871 ret.push(b'\\')
872 }
873 _ => {}
874 }
875 }
876 Some(b) => {
877 self.advance(1);
878 ret.push(b);
879 }
880 None => bail!("Expected some char"),
881 }
882 }
883 ret.push(b'"');
884
885 let v: std::result::Result<serde_json::Value, _> = serde_json::from_slice(&ret);
886 match v {
887 Ok(serde_json::Value::String(s)) => Ok(s),
888 _ => bail!("invalid string "),
889 }
890 }
891
892 fn read_binary<V: CopyFromBuf>(&mut self) -> Result<V> {
893 self.eat(b"\"")?;
894 let mut ret = Vec::new();
895 loop {
896 match self.peek() {
897 Some(b'"') => {
898 self.advance(1);
899 break;
900 }
901 Some(b) => {
902 self.advance(1);
903 ret.push(b);
904 }
905 None => bail!("Expected some char"),
906 }
907 }
908 let bin = base64::decode_config(&ret, base64::STANDARD_NO_PAD)
909 .context("the `binary` data in JSON string does not contain valid base64")?;
910 Ok(V::from_vec(bin))
911 }
912
913 fn skip(&mut self, field_type: TType) -> Result<()> {
915 self.skip_inner(field_type, DEFAULT_RECURSION_DEPTH)
916 }
917}
918
919pub trait SerializeRef:
920 Serialize<SimpleJsonProtocolSerializer<SizeCounter>>
921 + Serialize<SimpleJsonProtocolSerializer<BytesMut>>
922where
923 for<'a> &'a Self: Serialize<SimpleJsonProtocolSerializer<SizeCounter>>,
924 for<'a> &'a Self: Serialize<SimpleJsonProtocolSerializer<BytesMut>>,
925{
926}
927
928impl<T> SerializeRef for T
929where
930 T: Serialize<SimpleJsonProtocolSerializer<BytesMut>>,
931 T: Serialize<SimpleJsonProtocolSerializer<SizeCounter>>,
932 for<'a> &'a T: Serialize<SimpleJsonProtocolSerializer<BytesMut>>,
933 for<'a> &'a T: Serialize<SimpleJsonProtocolSerializer<SizeCounter>>,
934{
935}
936
937pub trait Serializable:
938 Serialize<SimpleJsonProtocolSerializer<SizeCounter>>
939 + Serialize<SimpleJsonProtocolSerializer<BytesMut>>
940{
941}
942
943impl<T> Serializable for T where
944 T: Serialize<SimpleJsonProtocolSerializer<SizeCounter>>
945 + Serialize<SimpleJsonProtocolSerializer<BytesMut>>
946{
947}
948
949pub fn serialize<T>(v: T) -> Bytes
951where
952 T: Serializable,
953{
954 let mut sizer = SimpleJsonProtocolSerializer {
955 buffer: SizeCounter::new().writer(),
956 state: vec![SerializationState::NotInContainer],
957 };
958 v.write(&mut sizer);
959
960 let sz = sizer.finish();
961
962 let mut buf = SimpleJsonProtocolSerializer {
964 buffer: BytesMut::with_capacity(sz).writer(),
965 state: vec![SerializationState::NotInContainer],
966 };
967 v.write(&mut buf);
968
969 buf.finish()
971}
972
973pub trait DeserializeSlice:
974 for<'a> Deserialize<SimpleJsonProtocolDeserializer<Cursor<&'a [u8]>>>
975{
976}
977
978impl<T> DeserializeSlice for T where
979 T: for<'a> Deserialize<SimpleJsonProtocolDeserializer<Cursor<&'a [u8]>>>
980{
981}
982
983pub fn deserialize<T, B, C>(b: B) -> Result<T>
985where
986 B: Into<DeserializeSource<C>>,
987 C: BufExt,
988 T: Deserialize<SimpleJsonProtocolDeserializer<C>>,
989{
990 let source: DeserializeSource<C> = b.into();
991 let mut deser = SimpleJsonProtocolDeserializer::new(source.0);
992 let t = T::read(&mut deser)?;
993 if deser.peek().is_some() {
994 bail!(ProtocolError::TrailingData);
995 }
996 Ok(t)
997}
998
999enum ValueKind {
1001 Null,
1002 Bool,
1003 Number,
1004 String,
1005 Array,
1006 Object,
1007}
1008
1009impl<B: Buf> Deserialize<SimpleJsonProtocolDeserializer<B>> for serde_json::Value {
1010 fn read(p: &mut SimpleJsonProtocolDeserializer<B>) -> Result<Self> {
1011 p.read_json_value(DEFAULT_RECURSION_DEPTH)
1012 }
1013}