fn poll()

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())));
                    }
                }
            }
        }
    }