From 40cbd0f296556f91e3c4c3d429dffc34e1b3f3e7 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Mon, 26 Feb 2018 13:38:56 -0500 Subject: [PATCH] length_delimited: add a native_endian builder method (#144) This method is useful when reading from a operating system service. --- tokio-io/src/length_delimited.rs | 26 ++++++++++++++++++++++++++ tokio-io/tests/length_delimited.rs | 17 +++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/tokio-io/src/length_delimited.rs b/tokio-io/src/length_delimited.rs index 54e305ee1..7de61a350 100644 --- a/tokio-io/src/length_delimited.rs +++ b/tokio-io/src/length_delimited.rs @@ -649,6 +649,32 @@ impl Builder { self } + /// Read the length field as a native endian integer + /// + /// The default setting is big endian. + /// + /// This configuration option applies to both encoding and decoding. + /// + /// # Examples + /// + /// ``` + /// # use tokio_io::AsyncRead; + /// use tokio_io::codec::length_delimited::Builder; + /// + /// # fn bind_read(io: T) { + /// Builder::new() + /// .native_endian() + /// .new_read(io); + /// # } + /// ``` + pub fn native_endian(&mut self) -> &mut Self { + if cfg!(target_endian = "big") { + self.big_endian() + } else { + self.little_endian() + } + } + /// Sets the max frame length /// /// This configuration option applies to both encoding and decoding. The diff --git a/tokio-io/tests/length_delimited.rs b/tokio-io/tests/length_delimited.rs index a94ae688d..b51cda2c1 100644 --- a/tokio-io/tests/length_delimited.rs +++ b/tokio-io/tests/length_delimited.rs @@ -48,6 +48,23 @@ fn read_single_frame_one_packet_little_endian() { assert_eq!(io.poll().unwrap(), Ready(None)); } +#[test] +fn read_single_frame_one_packet_native_endian() { + let data = if cfg!(target_endian = "big") { + b"\x00\x00\x00\x09abcdefghi" + } else { + b"\x09\x00\x00\x00abcdefghi" + }; + let mut io = Builder::new() + .native_endian() + .new_read(mock! { + Ok(data[..].into()), + }); + + assert_eq!(io.poll().unwrap(), Ready(Some(b"abcdefghi"[..].into()))); + assert_eq!(io.poll().unwrap(), Ready(None)); +} + #[test] fn read_single_multi_frame_one_packet() { let mut data: Vec = vec![];