fbthrift_git/
simplejson_protocol.rs

1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17use 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        // Instantiate a serializer with SizeCounter to count up the output buffer size
82        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        // Now that we have the size, allocate an output buffer and serialize into it
90        let mut buf = SimpleJsonProtocolSerializer {
91            buffer: F::enc_with_capacity(sz).writer(),
92            state: vec![SerializationState::NotInContainer],
93        };
94        ser(&mut buf);
95
96        // Done
97        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; // Our final form is whatever the buffer produces
156
157    // TODO what to do here
158    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    // TODO(azw): codify this (number of bytes left) in the Deserializer API
384    // `bytes` (named `chunks` in bytes1.0) does not represent a contiguous slice
385    // of the remaining bytes. All we can do is check if there is a byte to return
386    /// Returns a byte from the underly buffer if there is enough remaining
387    pub fn peek(&self) -> Option<u8> {
388        // fast path like https://docs.rs/bytes/1.0.1/src/bytes/buf/buf_impl.rs.html#18
389        if !self.buffer.chunk().is_empty() {
390            Some(self.buffer.chunk()[0])
391        } else {
392            None
393        }
394    }
395
396    /// Like peek but panics if there is none remaining
397    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    // Validates that next chars is `val`
410    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                // TODO(azw): better error messages
422                bail!("Expected {} got {}", to_check, b)
423            }
424            self.advance(1);
425        }
426        Ok(())
427    }
428
429    // Validates that next chars is `val`. Strip whitespace before and after
430    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        // advance will panic if we try to advance more than remaining
441        self.remaining -= len
442    }
443
444    // Attempts to eat a comma, returns
445    // Trailing if this a "trailing" comma, where trailing means its
446    //   trailed by the `trailing` byte
447    // NonTrailing if its read a comma that isn't trailing
448    // NoComma if it found no comma in the middle of the container
449    // End if it correctly found no comma at the end of the container
450    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    // Fallback to guessing what "type" of structure we are parsing and mark
625    // the field_id as something impossible so we skip everything underneath this string
626    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        // Check if its time to give up
696        self.strip_whitespace();
697        match self.peek() {
698            Some(b'"') => {}
699            _ => return Ok((fieldfn(&[]), TType::Stop, -1)),
700        }
701
702        // Something went wrong if we dont find a string
703        let field_name = self.read_string()?;
704        self.eat(b":")?;
705
706        // Did we find a field we know about?
707        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        // -1 means we fallthrough to start skipping
717        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        // Meaningless type, self.skip_inner and deserialize do not depend on it
732        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                // We are finished with this map
740                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    /// Override the default skip impl to handle random JSON noise
914    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
949/// Serialize a Thrift value using the simple JSON protocol.
950pub 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    // Now that we have the size, allocate an output buffer and serialize into it
963    let mut buf = SimpleJsonProtocolSerializer {
964        buffer: BytesMut::with_capacity(sz).writer(),
965        state: vec![SerializationState::NotInContainer],
966    };
967    v.write(&mut buf);
968
969    // Done
970    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
983/// Deserialize a Thrift blob using the compact protocol.
984pub 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
999// Aligns with the variant names of serde_json::Value.
1000enum 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}