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/reader.rs | |
parent | c8c0dbaba82bd53b7d311a7ba1fe97474e2f398e (diff) | |
download | ttyrec-05cefcdf32b2d3dc9a2cf3f9b391bfda785bd801.tar.gz ttyrec-05cefcdf32b2d3dc9a2cf3f9b391bfda785bd801.zip |
break it up into files
Diffstat (limited to 'src/reader.rs')
-rw-r--r-- | src/reader.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/reader.rs b/src/reader.rs new file mode 100644 index 0000000..4d122f9 --- /dev/null +++ b/src/reader.rs @@ -0,0 +1,41 @@ +use snafu::ResultExt as _; + +pub struct Reader<R> { + reader: R, + parser: crate::parser::Parser, + read_buf: [u8; 4096], + done_reading: bool, +} + +impl<R: tokio::io::AsyncRead> Reader<R> { + pub fn new(reader: R) -> Self { + Self { + reader, + parser: crate::parser::Parser::new(), + read_buf: [0; 4096], + done_reading: false, + } + } + + pub fn poll_read( + &mut self, + ) -> futures::Poll<Option<crate::frame::Frame>, crate::error::Error> { + loop { + if let Some(frame) = self.parser.next_frame() { + return Ok(futures::Async::Ready(Some(frame))); + } else if self.done_reading { + return Ok(futures::Async::Ready(None)); + } + + let n = futures::try_ready!(self + .reader + .poll_read(&mut self.read_buf) + .context(crate::error::ReadFile)); + if n > 0 { + self.parser.add_bytes(&self.read_buf[..n]); + } else { + self.done_reading = true; + } + } + } +} |