fn next()

in core/src/raw/oio/page/into_flat_page.rs [158:210]


    fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
        loop {
            if let Some(de) = self.dirs.pop_back() {
                let (_, op) = self.acc.blocking_list(de.path(), OpList::new())?;
                self.pagers.push((op, de, vec![]))
            }

            let (mut pager, de, mut buf) = match self.pagers.pop() {
                Some((pager, de, buf)) => (pager, de, buf),
                None => {
                    if !self.res.is_empty() {
                        return Ok(Some(mem::take(&mut self.res)));
                    }
                    return Ok(None);
                }
            };

            if buf.is_empty() {
                match pager.next()? {
                    Some(v) => {
                        buf = v;
                    }
                    None => {
                        // Only push entry if it's not root dir
                        if de.path() != self.root {
                            self.res.push(de);
                        }
                        continue;
                    }
                }
            }

            let mut buf = VecDeque::from(buf);
            loop {
                if let Some(oe) = buf.pop_front() {
                    if oe.mode().is_dir() {
                        self.dirs.push_back(oe);
                        self.pagers.push((pager, de, buf.into()));
                        break;
                    } else {
                        self.res.push(oe)
                    }
                } else {
                    self.pagers.push((pager, de, vec![]));
                    break;
                }
            }

            if self.res.len() >= self.size {
                return Ok(Some(mem::take(&mut self.res)));
            }
        }
    }