From 05cefcdf32b2d3dc9a2cf3f9b391bfda785bd801 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 25 Oct 2019 06:34:48 -0400 Subject: break it up into files --- src/writer.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/writer.rs (limited to 'src/writer.rs') diff --git a/src/writer.rs b/src/writer.rs new file mode 100644 index 0000000..7d2ecb4 --- /dev/null +++ b/src/writer.rs @@ -0,0 +1,40 @@ +use snafu::ResultExt as _; + +pub struct Writer { + writer: W, + creator: crate::creator::Creator, + to_write: std::collections::VecDeque, +} + +impl Writer { + pub fn new(writer: W) -> Self { + Self { + writer, + creator: crate::creator::Creator::new(), + to_write: std::collections::VecDeque::new(), + } + } + + pub fn frame(&mut self, data: &[u8]) -> crate::error::Result<()> { + let bytes = self.creator.frame(data)?; + self.to_write.extend(bytes.iter()); + Ok(()) + } + + pub fn poll_write(&mut self) -> futures::Poll<(), crate::error::Error> { + let (a, b) = self.to_write.as_slices(); + let buf = if a.is_empty() { b } else { a }; + let n = futures::try_ready!(self + .writer + .poll_write(buf) + .context(crate::error::WriteFile)); + for _ in 0..n { + self.to_write.pop_front(); + } + Ok(futures::Async::Ready(())) + } + + pub fn is_empty(&self) -> bool { + self.to_write.is_empty() + } +} -- cgit v1.2.3-54-g00ecf