diff options
author | Ben Boeckel <mathstuf@users.noreply.github.com> | 2018-02-26 13:38:56 -0500 |
---|---|---|
committer | Carl Lerche <me@carllerche.com> | 2018-02-26 10:38:56 -0800 |
commit | 40cbd0f296556f91e3c4c3d429dffc34e1b3f3e7 (patch) | |
tree | 8246770b612d1b61e4d26cc1729893f40c6e1a29 | |
parent | 3b64fe93638a8453a1c001a6a443915e4ac71c25 (diff) |
length_delimited: add a native_endian builder method (#144)
This method is useful when reading from a operating system service.
-rw-r--r-- | tokio-io/src/length_delimited.rs | 26 | ||||
-rw-r--r-- | tokio-io/tests/length_delimited.rs | 17 |
2 files changed, 43 insertions, 0 deletions
diff --git a/tokio-io/src/length_delimited.rs b/tokio-io/src/length_delimited.rs index 54e305ee..7de61a35 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<T: AsyncRead>(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 a94ae688..b51cda2c 100644 --- a/tokio-io/tests/length_delimited.rs +++ b/tokio-io/tests/length_delimited.rs @@ -49,6 +49,23 @@ fn read_single_frame_one_packet_little_endian() { } #[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<u8> = vec![]; data.extend_from_slice(b"\x00\x00\x00\x09abcdefghi"); |