in shed/futures_01_ext/src/encode.rs [61:96]
fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> {
// Loop filling the buffer until either the input is done or
// the output buffer is large enough.
loop {
let mut push = false;
if !self.eof {
match self.inp.poll()? {
Async::Ready(None) => self.eof = true,
Async::Ready(Some(item)) => self.enc.encode(item, &mut self.buf)?,
Async::NotReady => push = true, // no input -> push output to avoid deadlock
}
}
let len = self.buf.len();
let push = push || len > HIGHWATER || self.eof;
if push {
match (len == 0, self.eof) {
// Input finished, no output
(true, true) => return Ok(Async::Ready(None)),
// Input not finished, no output
(true, false) => return Ok(Async::NotReady),
// Something to output
(false, eof) => {
let ret = self.buf.split_to(len);
// regrow buffer if we're not done
if !eof {
self.buf.reserve(HIGHWATER)
}
return Ok(Async::Ready(Some(ret.freeze())));
}
}
}
}
}