Skip to content

Commit 6255fd5

Browse files
committed
feat: add &mut [u8] implementation for TOutputProtocol
1 parent cda8a05 commit 6255fd5

File tree

3 files changed

+433
-2
lines changed

3 files changed

+433
-2
lines changed

pilota/src/thrift/binary.rs

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,189 @@ impl TOutputProtocol for TBinaryProtocol<&mut LinkedBytes> {
559559
}
560560
}
561561

562+
impl<'a> TOutputProtocol for TBinaryProtocol<&'a mut [u8]> {
563+
type BufMut = &'a mut [u8];
564+
565+
#[inline]
566+
fn write_message_begin(
567+
&mut self,
568+
identifier: &TMessageIdentifier,
569+
) -> Result<(), ThriftException> {
570+
let msg_type_u8: u8 = identifier.message_type.into();
571+
let version = (VERSION_1 | msg_type_u8 as u32) as i32;
572+
self.write_i32(version)?;
573+
self.write_faststr(identifier.name.clone())?;
574+
self.write_i32(identifier.sequence_number)?;
575+
Ok(())
576+
}
577+
578+
#[inline]
579+
fn write_message_end(&mut self) -> Result<(), ThriftException> {
580+
Ok(())
581+
}
582+
583+
#[inline]
584+
fn write_struct_begin(&mut self, _: &TStructIdentifier) -> Result<(), ThriftException> {
585+
Ok(())
586+
}
587+
588+
#[inline]
589+
fn write_struct_end(&mut self) -> Result<(), ThriftException> {
590+
Ok(())
591+
}
592+
593+
#[inline]
594+
fn write_field_begin(&mut self, field_type: TType, id: i16) -> Result<(), ThriftException> {
595+
let mut data: [u8; 3] = [0; 3];
596+
data[0] = field_type as u8;
597+
let id = id.to_be_bytes();
598+
data[1] = id[0];
599+
data[2] = id[1];
600+
self.trans.write_slice(&data);
601+
Ok(())
602+
}
603+
604+
#[inline]
605+
fn write_field_end(&mut self) -> Result<(), ThriftException> {
606+
Ok(())
607+
}
608+
609+
#[inline]
610+
fn write_field_stop(&mut self) -> Result<(), ThriftException> {
611+
self.write_byte(TType::Stop as u8)
612+
}
613+
614+
#[inline]
615+
fn write_bool(&mut self, b: bool) -> Result<(), ThriftException> {
616+
if b {
617+
self.write_i8(1)
618+
} else {
619+
self.write_i8(0)
620+
}
621+
}
622+
623+
#[inline]
624+
fn write_bytes(&mut self, b: Bytes) -> Result<(), ThriftException> {
625+
self.write_i32(b.len() as i32)?;
626+
self.write_bytes_without_len(b)
627+
}
628+
629+
#[inline]
630+
fn write_bytes_without_len(&mut self, b: Bytes) -> Result<(), ThriftException> {
631+
self.trans.write_slice(&b);
632+
Ok(())
633+
}
634+
635+
#[inline]
636+
fn write_byte(&mut self, b: u8) -> Result<(), ThriftException> {
637+
self.trans.write_u8(b);
638+
Ok(())
639+
}
640+
641+
#[inline]
642+
fn write_uuid(&mut self, u: [u8; 16]) -> Result<(), ThriftException> {
643+
self.trans.write_slice(&u);
644+
Ok(())
645+
}
646+
647+
#[inline]
648+
fn write_i8(&mut self, i: i8) -> Result<(), ThriftException> {
649+
self.trans.write_i8(i);
650+
Ok(())
651+
}
652+
653+
#[inline]
654+
fn write_i16(&mut self, i: i16) -> Result<(), ThriftException> {
655+
self.trans.write_i16(i);
656+
Ok(())
657+
}
658+
659+
#[inline]
660+
fn write_i32(&mut self, i: i32) -> Result<(), ThriftException> {
661+
self.trans.write_i32(i);
662+
Ok(())
663+
}
664+
665+
#[inline]
666+
fn write_i64(&mut self, i: i64) -> Result<(), ThriftException> {
667+
self.trans.write_i64(i);
668+
Ok(())
669+
}
670+
671+
#[inline]
672+
fn write_double(&mut self, d: f64) -> Result<(), ThriftException> {
673+
self.trans.write_f64(d);
674+
Ok(())
675+
}
676+
677+
#[inline]
678+
fn write_string(&mut self, s: &str) -> Result<(), ThriftException> {
679+
self.write_i32(s.len() as i32)?;
680+
self.trans.write_slice(s.as_bytes());
681+
Ok(())
682+
}
683+
684+
#[inline]
685+
fn write_faststr(&mut self, s: FastStr) -> Result<(), ThriftException> {
686+
self.write_i32(s.len() as i32)?;
687+
self.trans.write_slice(s.as_ref());
688+
Ok(())
689+
}
690+
691+
#[inline]
692+
fn write_list_begin(&mut self, identifier: TListIdentifier) -> Result<(), ThriftException> {
693+
self.write_byte(identifier.element_type.into())?;
694+
self.write_i32(identifier.size as i32)
695+
}
696+
697+
#[inline]
698+
fn write_list_end(&mut self) -> Result<(), ThriftException> {
699+
Ok(())
700+
}
701+
702+
#[inline]
703+
fn write_set_begin(&mut self, identifier: TSetIdentifier) -> Result<(), ThriftException> {
704+
self.write_byte(identifier.element_type.into())?;
705+
self.write_i32(identifier.size as i32)
706+
}
707+
708+
#[inline]
709+
fn write_set_end(&mut self) -> Result<(), ThriftException> {
710+
Ok(())
711+
}
712+
713+
#[inline]
714+
fn write_map_begin(&mut self, identifier: TMapIdentifier) -> Result<(), ThriftException> {
715+
let key_type = identifier.key_type;
716+
self.write_byte(key_type.into())?;
717+
let val_type = identifier.value_type;
718+
self.write_byte(val_type.into())?;
719+
self.write_i32(identifier.size as i32)
720+
}
721+
722+
#[inline]
723+
fn write_map_end(&mut self) -> Result<(), ThriftException> {
724+
Ok(())
725+
}
726+
727+
#[inline]
728+
fn flush(&mut self) -> Result<(), ThriftException> {
729+
Ok(())
730+
}
731+
732+
#[inline]
733+
fn write_bytes_vec(&mut self, b: &[u8]) -> Result<(), ThriftException> {
734+
self.write_i32(b.len() as i32)?;
735+
self.trans.write_slice(b);
736+
Ok(())
737+
}
738+
739+
#[inline]
740+
fn buf_mut(&mut self) -> &mut Self::BufMut {
741+
&mut self.trans
742+
}
743+
}
744+
562745
impl TInputProtocol for TBinaryProtocol<&mut Bytes> {
563746
type Buf = Bytes;
564747

0 commit comments

Comments
 (0)