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