diff --git a/src/chunk.rs b/src/chunk.rs index f0f8d220..692a961d 100644 --- a/src/chunk.rs +++ b/src/chunk.rs @@ -4,10 +4,19 @@ use bytes::Bytes; use h2::ReleaseCapacity; /// A piece of a message body. -pub struct Chunk(Inner); - -struct Inner { +/// +/// These are returned by [`Body`](::Body). It is an efficient buffer type, +/// and wraps auto-management of flow control in the case of HTTP2 messages. +/// +/// A `Chunk` can be easily created by many of Rust's standard types that +/// represent a collection of bytes, using `Chunk::from`. +pub struct Chunk { + /// The buffer of bytes making up this body. bytes: Bytes, + /// A possible HTTP2 marker to ensure we release window capacity. + /// + /// This version just automatically releases all capacity when `Chunk` + /// is dropped. _flow_control: Option, } @@ -25,13 +34,22 @@ impl Drop for AutoRelease { impl Chunk { pub(crate) fn h2(bytes: Bytes, rel_cap: &ReleaseCapacity) -> Chunk { let cap = bytes.len(); - Chunk(Inner { + Chunk { bytes: bytes, _flow_control: Some(AutoRelease { cap: cap, release: rel_cap.clone(), }), - }) + } + } + + /// Converts this `Chunk` directly into the `Bytes` type without copies. + /// + /// This is simply an inherent alias for `Bytes::from(chunk)`, which exists, + /// but doesn't appear in rustdocs. + #[inline] + pub fn into_bytes(self) -> Bytes { + self.into() } } @@ -66,17 +84,17 @@ impl From<&'static str> for Chunk { impl From for Chunk { #[inline] fn from(bytes: Bytes) -> Chunk { - Chunk(Inner { + Chunk { bytes: bytes, _flow_control: None, - }) + } } } impl From for Bytes { #[inline] fn from(chunk: Chunk) -> Bytes { - chunk.0.bytes + chunk.bytes } } @@ -92,7 +110,7 @@ impl ::std::ops::Deref for Chunk { impl AsRef<[u8]> for Chunk { #[inline] fn as_ref(&self) -> &[u8] { - &self.0.bytes + &self.bytes } } @@ -116,13 +134,13 @@ impl IntoIterator for Chunk { #[inline] fn into_iter(self) -> Self::IntoIter { - self.0.bytes.into_iter() + self.bytes.into_iter() } } impl Extend for Chunk { #[inline] fn extend(&mut self, iter: T) where T: IntoIterator { - self.0.bytes.extend(iter) + self.bytes.extend(iter) } }