diff options
author | Jesse Luehrs <doy@tozt.net> | 2019-10-25 06:34:48 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2019-10-25 06:59:12 -0400 |
commit | 05cefcdf32b2d3dc9a2cf3f9b391bfda785bd801 (patch) | |
tree | 6fe31dc6961c4ef71da455d572a6663b816879a2 /src/writer.rs | |
parent | c8c0dbaba82bd53b7d311a7ba1fe97474e2f398e (diff) | |
download | ttyrec-05cefcdf32b2d3dc9a2cf3f9b391bfda785bd801.tar.gz ttyrec-05cefcdf32b2d3dc9a2cf3f9b391bfda785bd801.zip |
break it up into files
Diffstat (limited to 'src/writer.rs')
-rw-r--r-- | src/writer.rs | 40 |
1 files changed, 40 insertions, 0 deletions
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<W> { + writer: W, + creator: crate::creator::Creator, + to_write: std::collections::VecDeque<u8>, +} + +impl<W: tokio::io::AsyncWrite> Writer<W> { + 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() + } +} |