1use std::convert::{From, TryFrom};
61use std::fmt;
62use std::fmt::{Display, Formatter};
63
64use crate::thrift::{ApplicationError, Error, ProtocolError, ProtocolErrorKind};
65
66mod compact;
67mod compact_stream;
68pub use compact_stream::TCompactInputStreamProtocol;
69mod compact_stream_write;
70pub use compact_stream_write::TCompactOutputStreamProtocol;
71mod stream;
72pub use stream::{TInputStreamProtocol, TOutputStreamProtocol};
73
74pub use self::compact::{TCompactInputProtocol, TCompactOutputProtocol};
75
76const MAXIMUM_SKIP_DEPTH: i8 = 64;
81
82pub trait TInputProtocol {
111 fn read_message_begin(&mut self) -> crate::thrift::Result<TMessageIdentifier>;
113 fn read_message_end(&mut self) -> crate::thrift::Result<()>;
115 fn read_struct_begin(&mut self) -> crate::thrift::Result<Option<TStructIdentifier>>;
117 fn read_struct_end(&mut self) -> crate::thrift::Result<()>;
119 fn read_field_begin(&mut self) -> crate::thrift::Result<TFieldIdentifier>;
121 fn read_field_end(&mut self) -> crate::thrift::Result<()>;
123 fn read_bool(&mut self) -> crate::thrift::Result<bool>;
125 fn read_bytes(&mut self) -> crate::thrift::Result<Vec<u8>>;
127 fn read_i8(&mut self) -> crate::thrift::Result<i8>;
129 fn read_i16(&mut self) -> crate::thrift::Result<i16>;
131 fn read_i32(&mut self) -> crate::thrift::Result<i32>;
133 fn read_i64(&mut self) -> crate::thrift::Result<i64>;
135 fn read_double(&mut self) -> crate::thrift::Result<f64>;
137 fn read_string(&mut self) -> crate::thrift::Result<String>;
139 fn read_list_begin(&mut self) -> crate::thrift::Result<TListIdentifier>;
141 fn read_list_end(&mut self) -> crate::thrift::Result<()>;
143 fn read_set_begin(&mut self) -> crate::thrift::Result<TSetIdentifier>;
145 fn read_set_end(&mut self) -> crate::thrift::Result<()>;
147 fn read_map_begin(&mut self) -> crate::thrift::Result<TMapIdentifier>;
149 fn read_map_end(&mut self) -> crate::thrift::Result<()>;
151 fn skip(&mut self, field_type: TType) -> crate::thrift::Result<()> {
154 self.skip_till_depth(field_type, MAXIMUM_SKIP_DEPTH)
155 }
156 fn skip_till_depth(&mut self, field_type: TType, depth: i8) -> crate::thrift::Result<()> {
158 if depth == 0 {
159 return Err(crate::thrift::Error::Protocol(ProtocolError {
160 kind: ProtocolErrorKind::DepthLimit,
161 message: format!("cannot parse past {:?}", field_type),
162 }));
163 }
164
165 match field_type {
166 TType::Bool => self.read_bool().map(|_| ()),
167 TType::I08 => self.read_i8().map(|_| ()),
168 TType::I16 => self.read_i16().map(|_| ()),
169 TType::I32 => self.read_i32().map(|_| ()),
170 TType::I64 => self.read_i64().map(|_| ()),
171 TType::Double => self.read_double().map(|_| ()),
172 TType::String => self.read_string().map(|_| ()),
173 TType::Struct => {
174 self.read_struct_begin()?;
175 loop {
176 let field_ident = self.read_field_begin()?;
177 if field_ident.field_type == TType::Stop {
178 break;
179 }
180 self.skip_till_depth(field_ident.field_type, depth - 1)?;
181 }
182 self.read_struct_end()
183 }
184 TType::List => {
185 let list_ident = self.read_list_begin()?;
186 for _ in 0..list_ident.size {
187 self.skip_till_depth(list_ident.element_type, depth - 1)?;
188 }
189 self.read_list_end()
190 }
191 TType::Set => {
192 let set_ident = self.read_set_begin()?;
193 for _ in 0..set_ident.size {
194 self.skip_till_depth(set_ident.element_type, depth - 1)?;
195 }
196 self.read_set_end()
197 }
198 TType::Map => {
199 let map_ident = self.read_map_begin()?;
200 for _ in 0..map_ident.size {
201 let key_type = map_ident
202 .key_type
203 .expect("non-zero sized map should contain key type");
204 let val_type = map_ident
205 .value_type
206 .expect("non-zero sized map should contain value type");
207 self.skip_till_depth(key_type, depth - 1)?;
208 self.skip_till_depth(val_type, depth - 1)?;
209 }
210 self.read_map_end()
211 }
212 u => Err(crate::thrift::Error::Protocol(ProtocolError {
213 kind: ProtocolErrorKind::Unknown,
214 message: format!("cannot skip field type {:?}", &u),
215 })),
216 }
217 }
218
219 fn read_byte(&mut self) -> crate::thrift::Result<u8>;
226}
227
228pub trait TOutputProtocol {
260 fn write_message_begin(
262 &mut self,
263 identifier: &TMessageIdentifier,
264 ) -> crate::thrift::Result<usize>;
265 fn write_message_end(&mut self) -> crate::thrift::Result<usize>;
267 fn write_struct_begin(
269 &mut self,
270 identifier: &TStructIdentifier,
271 ) -> crate::thrift::Result<usize>;
272 fn write_struct_end(&mut self) -> crate::thrift::Result<usize>;
274 fn write_field_begin(&mut self, identifier: &TFieldIdentifier) -> crate::thrift::Result<usize>;
276 fn write_field_end(&mut self) -> crate::thrift::Result<usize>;
278 fn write_field_stop(&mut self) -> crate::thrift::Result<usize>;
281 fn write_bool(&mut self, b: bool) -> crate::thrift::Result<usize>;
283 fn write_bytes(&mut self, b: &[u8]) -> crate::thrift::Result<usize>;
285 fn write_i8(&mut self, i: i8) -> crate::thrift::Result<usize>;
287 fn write_i16(&mut self, i: i16) -> crate::thrift::Result<usize>;
289 fn write_i32(&mut self, i: i32) -> crate::thrift::Result<usize>;
291 fn write_i64(&mut self, i: i64) -> crate::thrift::Result<usize>;
293 fn write_double(&mut self, d: f64) -> crate::thrift::Result<usize>;
295 fn write_string(&mut self, s: &str) -> crate::thrift::Result<usize>;
297 fn write_list_begin(&mut self, identifier: &TListIdentifier) -> crate::thrift::Result<usize>;
299 fn write_list_end(&mut self) -> crate::thrift::Result<usize>;
301 fn write_set_begin(&mut self, identifier: &TSetIdentifier) -> crate::thrift::Result<usize>;
303 fn write_set_end(&mut self) -> crate::thrift::Result<usize>;
305 fn write_map_begin(&mut self, identifier: &TMapIdentifier) -> crate::thrift::Result<usize>;
307 fn write_map_end(&mut self) -> crate::thrift::Result<usize>;
309 fn flush(&mut self) -> crate::thrift::Result<()>;
311
312 fn write_byte(&mut self, b: u8) -> crate::thrift::Result<usize>; }
320
321impl<P> TInputProtocol for Box<P>
322where
323 P: TInputProtocol + ?Sized,
324{
325 fn read_message_begin(&mut self) -> crate::thrift::Result<TMessageIdentifier> {
326 (**self).read_message_begin()
327 }
328
329 fn read_message_end(&mut self) -> crate::thrift::Result<()> {
330 (**self).read_message_end()
331 }
332
333 fn read_struct_begin(&mut self) -> crate::thrift::Result<Option<TStructIdentifier>> {
334 (**self).read_struct_begin()
335 }
336
337 fn read_struct_end(&mut self) -> crate::thrift::Result<()> {
338 (**self).read_struct_end()
339 }
340
341 fn read_field_begin(&mut self) -> crate::thrift::Result<TFieldIdentifier> {
342 (**self).read_field_begin()
343 }
344
345 fn read_field_end(&mut self) -> crate::thrift::Result<()> {
346 (**self).read_field_end()
347 }
348
349 fn read_bool(&mut self) -> crate::thrift::Result<bool> {
350 (**self).read_bool()
351 }
352
353 fn read_bytes(&mut self) -> crate::thrift::Result<Vec<u8>> {
354 (**self).read_bytes()
355 }
356
357 fn read_i8(&mut self) -> crate::thrift::Result<i8> {
358 (**self).read_i8()
359 }
360
361 fn read_i16(&mut self) -> crate::thrift::Result<i16> {
362 (**self).read_i16()
363 }
364
365 fn read_i32(&mut self) -> crate::thrift::Result<i32> {
366 (**self).read_i32()
367 }
368
369 fn read_i64(&mut self) -> crate::thrift::Result<i64> {
370 (**self).read_i64()
371 }
372
373 fn read_double(&mut self) -> crate::thrift::Result<f64> {
374 (**self).read_double()
375 }
376
377 fn read_string(&mut self) -> crate::thrift::Result<String> {
378 (**self).read_string()
379 }
380
381 fn read_list_begin(&mut self) -> crate::thrift::Result<TListIdentifier> {
382 (**self).read_list_begin()
383 }
384
385 fn read_list_end(&mut self) -> crate::thrift::Result<()> {
386 (**self).read_list_end()
387 }
388
389 fn read_set_begin(&mut self) -> crate::thrift::Result<TSetIdentifier> {
390 (**self).read_set_begin()
391 }
392
393 fn read_set_end(&mut self) -> crate::thrift::Result<()> {
394 (**self).read_set_end()
395 }
396
397 fn read_map_begin(&mut self) -> crate::thrift::Result<TMapIdentifier> {
398 (**self).read_map_begin()
399 }
400
401 fn read_map_end(&mut self) -> crate::thrift::Result<()> {
402 (**self).read_map_end()
403 }
404
405 fn read_byte(&mut self) -> crate::thrift::Result<u8> {
406 (**self).read_byte()
407 }
408}
409
410impl<P> TOutputProtocol for Box<P>
411where
412 P: TOutputProtocol + ?Sized,
413{
414 fn write_message_begin(
415 &mut self,
416 identifier: &TMessageIdentifier,
417 ) -> crate::thrift::Result<usize> {
418 (**self).write_message_begin(identifier)
419 }
420
421 fn write_message_end(&mut self) -> crate::thrift::Result<usize> {
422 (**self).write_message_end()
423 }
424
425 fn write_struct_begin(
426 &mut self,
427 identifier: &TStructIdentifier,
428 ) -> crate::thrift::Result<usize> {
429 (**self).write_struct_begin(identifier)
430 }
431
432 fn write_struct_end(&mut self) -> crate::thrift::Result<usize> {
433 (**self).write_struct_end()
434 }
435
436 fn write_field_begin(&mut self, identifier: &TFieldIdentifier) -> crate::thrift::Result<usize> {
437 (**self).write_field_begin(identifier)
438 }
439
440 fn write_field_end(&mut self) -> crate::thrift::Result<usize> {
441 (**self).write_field_end()
442 }
443
444 fn write_field_stop(&mut self) -> crate::thrift::Result<usize> {
445 (**self).write_field_stop()
446 }
447
448 fn write_bool(&mut self, b: bool) -> crate::thrift::Result<usize> {
449 (**self).write_bool(b)
450 }
451
452 fn write_bytes(&mut self, b: &[u8]) -> crate::thrift::Result<usize> {
453 (**self).write_bytes(b)
454 }
455
456 fn write_i8(&mut self, i: i8) -> crate::thrift::Result<usize> {
457 (**self).write_i8(i)
458 }
459
460 fn write_i16(&mut self, i: i16) -> crate::thrift::Result<usize> {
461 (**self).write_i16(i)
462 }
463
464 fn write_i32(&mut self, i: i32) -> crate::thrift::Result<usize> {
465 (**self).write_i32(i)
466 }
467
468 fn write_i64(&mut self, i: i64) -> crate::thrift::Result<usize> {
469 (**self).write_i64(i)
470 }
471
472 fn write_double(&mut self, d: f64) -> crate::thrift::Result<usize> {
473 (**self).write_double(d)
474 }
475
476 fn write_string(&mut self, s: &str) -> crate::thrift::Result<usize> {
477 (**self).write_string(s)
478 }
479
480 fn write_list_begin(&mut self, identifier: &TListIdentifier) -> crate::thrift::Result<usize> {
481 (**self).write_list_begin(identifier)
482 }
483
484 fn write_list_end(&mut self) -> crate::thrift::Result<usize> {
485 (**self).write_list_end()
486 }
487
488 fn write_set_begin(&mut self, identifier: &TSetIdentifier) -> crate::thrift::Result<usize> {
489 (**self).write_set_begin(identifier)
490 }
491
492 fn write_set_end(&mut self) -> crate::thrift::Result<usize> {
493 (**self).write_set_end()
494 }
495
496 fn write_map_begin(&mut self, identifier: &TMapIdentifier) -> crate::thrift::Result<usize> {
497 (**self).write_map_begin(identifier)
498 }
499
500 fn write_map_end(&mut self) -> crate::thrift::Result<usize> {
501 (**self).write_map_end()
502 }
503
504 fn flush(&mut self) -> crate::thrift::Result<()> {
505 (**self).flush()
506 }
507
508 fn write_byte(&mut self, b: u8) -> crate::thrift::Result<usize> {
509 (**self).write_byte(b)
510 }
511}
512
513#[derive(Clone, Debug, Eq, PartialEq)]
515pub struct TMessageIdentifier {
516 pub name: String,
518 pub message_type: TMessageType,
520 pub sequence_number: i32,
522}
523
524impl TMessageIdentifier {
525 pub fn new<S: Into<String>>(
528 name: S,
529 message_type: TMessageType,
530 sequence_number: i32,
531 ) -> TMessageIdentifier {
532 TMessageIdentifier {
533 name: name.into(),
534 message_type,
535 sequence_number,
536 }
537 }
538}
539
540#[derive(Clone, Debug, Eq, PartialEq)]
542pub struct TStructIdentifier {
543 pub name: String,
545}
546
547impl TStructIdentifier {
548 pub fn new<S: Into<String>>(name: S) -> TStructIdentifier {
550 TStructIdentifier { name: name.into() }
551 }
552}
553
554#[derive(Clone, Debug, Eq, PartialEq)]
556pub struct TFieldIdentifier {
557 pub name: Option<String>,
561 pub field_type: TType,
565 pub id: Option<i16>,
569}
570
571impl TFieldIdentifier {
572 pub fn new<N, S, I>(name: N, field_type: TType, id: I) -> TFieldIdentifier
577 where
578 N: Into<Option<S>>,
579 S: Into<String>,
580 I: Into<Option<i16>>,
581 {
582 TFieldIdentifier {
583 name: name.into().map(|n| n.into()),
584 field_type,
585 id: id.into(),
586 }
587 }
588}
589
590#[derive(Clone, Debug, Eq, PartialEq)]
592pub struct TListIdentifier {
593 pub element_type: TType,
595 pub size: i32,
597}
598
599impl TListIdentifier {
600 pub fn new(element_type: TType, size: i32) -> TListIdentifier {
603 TListIdentifier { element_type, size }
604 }
605}
606
607#[derive(Clone, Debug, Eq, PartialEq)]
609pub struct TSetIdentifier {
610 pub element_type: TType,
612 pub size: i32,
614}
615
616impl TSetIdentifier {
617 pub fn new(element_type: TType, size: i32) -> TSetIdentifier {
620 TSetIdentifier { element_type, size }
621 }
622}
623
624#[derive(Clone, Debug, Eq, PartialEq)]
626pub struct TMapIdentifier {
627 pub key_type: Option<TType>,
629 pub value_type: Option<TType>,
631 pub size: i32,
633}
634
635impl TMapIdentifier {
636 pub fn new<K, V>(key_type: K, value_type: V, size: i32) -> TMapIdentifier
639 where
640 K: Into<Option<TType>>,
641 V: Into<Option<TType>>,
642 {
643 TMapIdentifier {
644 key_type: key_type.into(),
645 value_type: value_type.into(),
646 size,
647 }
648 }
649}
650
651#[derive(Clone, Copy, Debug, Eq, PartialEq)]
653pub enum TMessageType {
654 Call,
656 Reply,
658 Exception,
660 OneWay,
662}
663
664impl Display for TMessageType {
665 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
666 match *self {
667 TMessageType::Call => write!(f, "Call"),
668 TMessageType::Reply => write!(f, "Reply"),
669 TMessageType::Exception => write!(f, "Exception"),
670 TMessageType::OneWay => write!(f, "OneWay"),
671 }
672 }
673}
674
675impl From<TMessageType> for u8 {
676 fn from(message_type: TMessageType) -> Self {
677 match message_type {
678 TMessageType::Call => 0x01,
679 TMessageType::Reply => 0x02,
680 TMessageType::Exception => 0x03,
681 TMessageType::OneWay => 0x04,
682 }
683 }
684}
685
686impl TryFrom<u8> for TMessageType {
687 type Error = Error;
688 fn try_from(b: u8) -> Result<Self, Self::Error> {
689 match b {
690 0x01 => Ok(TMessageType::Call),
691 0x02 => Ok(TMessageType::Reply),
692 0x03 => Ok(TMessageType::Exception),
693 0x04 => Ok(TMessageType::OneWay),
694 unkn => Err(Error::Protocol(ProtocolError {
695 kind: ProtocolErrorKind::InvalidData,
696 message: format!("cannot convert {} to TMessageType", unkn),
697 })),
698 }
699 }
700}
701
702#[derive(Clone, Copy, Debug, Eq, PartialEq)]
704pub enum TType {
705 Stop,
707 Void,
709 Bool,
711 I08,
713 Double,
715 I16,
717 I32,
719 I64,
721 String,
723 Utf7,
725 Struct,
727 Map,
729 Set,
731 List,
733 Utf8,
735 Utf16,
737}
738
739impl Display for TType {
740 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
741 match *self {
742 TType::Stop => write!(f, "STOP"),
743 TType::Void => write!(f, "void"),
744 TType::Bool => write!(f, "bool"),
745 TType::I08 => write!(f, "i08"),
746 TType::Double => write!(f, "double"),
747 TType::I16 => write!(f, "i16"),
748 TType::I32 => write!(f, "i32"),
749 TType::I64 => write!(f, "i64"),
750 TType::String => write!(f, "string"),
751 TType::Utf7 => write!(f, "UTF7"),
752 TType::Struct => write!(f, "struct"),
753 TType::Map => write!(f, "map"),
754 TType::Set => write!(f, "set"),
755 TType::List => write!(f, "list"),
756 TType::Utf8 => write!(f, "UTF8"),
757 TType::Utf16 => write!(f, "UTF16"),
758 }
759 }
760}
761
762pub fn verify_expected_sequence_number(expected: i32, actual: i32) -> crate::thrift::Result<()> {
767 if expected == actual {
768 Ok(())
769 } else {
770 Err(crate::thrift::Error::Application(
771 crate::thrift::ApplicationError {
772 kind: crate::thrift::ApplicationErrorKind::BadSequenceId,
773 message: format!("expected {} got {}", expected, actual),
774 },
775 ))
776 }
777}
778
779pub fn verify_expected_service_call(expected: &str, actual: &str) -> crate::thrift::Result<()> {
784 if expected == actual {
785 Ok(())
786 } else {
787 Err(crate::thrift::Error::Application(ApplicationError {
788 kind: crate::thrift::ApplicationErrorKind::WrongMethodName,
789 message: format!("expected {} got {}", expected, actual),
790 }))
791 }
792}
793
794pub fn verify_expected_message_type(
799 expected: TMessageType,
800 actual: TMessageType,
801) -> crate::thrift::Result<()> {
802 if expected == actual {
803 Ok(())
804 } else {
805 Err(crate::thrift::Error::Application(ApplicationError {
806 kind: crate::thrift::ApplicationErrorKind::InvalidMessageType,
807 message: format!("expected {} got {}", expected, actual),
808 }))
809 }
810}
811
812pub fn verify_required_field_exists<T>(
816 field_name: &str,
817 field: &Option<T>,
818) -> crate::thrift::Result<()> {
819 match *field {
820 Some(_) => Ok(()),
821 None => Err(Error::Protocol(ProtocolError {
822 kind: ProtocolErrorKind::Unknown,
823 message: format!("missing required field {}", field_name),
824 })),
825 }
826}
827
828pub fn field_id(field_ident: &TFieldIdentifier) -> crate::thrift::Result<i16> {
834 field_ident.id.ok_or_else(|| {
835 crate::thrift::Error::Protocol(crate::thrift::ProtocolError {
836 kind: crate::thrift::ProtocolErrorKind::Unknown,
837 message: format!("missing field in in {:?}", field_ident),
838 })
839 })
840}