diff options
author | Jesse Luehrs <doy@tozt.net> | 2019-10-24 15:16:10 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2019-10-24 15:16:10 -0400 |
commit | 894ec4f24c1269166f14c05b2ae3f737f76dd571 (patch) | |
tree | b30021b97dee11d1d5976561c42bd2cc59ee8762 /examples/input/buf.rs | |
parent | 090b50a13f0d07ae722dd9fe6ef064cd893ff6ec (diff) | |
download | tokio-pty-process-stream-894ec4f24c1269166f14c05b2ae3f737f76dd571.tar.gz tokio-pty-process-stream-894ec4f24c1269166f14c05b2ae3f737f76dd571.zip |
add a couple examples
Diffstat (limited to 'examples/input/buf.rs')
-rw-r--r-- | examples/input/buf.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/examples/input/buf.rs b/examples/input/buf.rs new file mode 100644 index 0000000..768baf1 --- /dev/null +++ b/examples/input/buf.rs @@ -0,0 +1,43 @@ +use std::io::Read as _; + +pub struct Stdin { + buf: Vec<u8>, + task: futures::task::Task, +} + +#[allow(dead_code)] +impl Stdin { + pub fn new() -> Self { + Self { + buf: vec![], + task: futures::task::current(), + } + } + + pub fn send(&mut self, buf: &[u8]) { + self.buf.extend(buf.iter()); + self.task.notify(); + } +} + +impl std::io::Read for Stdin { + fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> { + let len = self.buf.len().min(buf.len()); + buf[..len].clone_from_slice(&self.buf[..len]); + self.buf = self.buf.iter().copied().skip(len).collect(); + Ok(len) + } +} + +impl tokio::io::AsyncRead for Stdin { + fn poll_read( + &mut self, + buf: &mut [u8], + ) -> std::result::Result<futures::Async<usize>, tokio::io::Error> { + if self.buf.is_empty() { + return Ok(futures::Async::NotReady); + } + let n = self.read(buf)?; + Ok(futures::Async::Ready(n)) + } +} |