in core/src/raw/oio/list/flat_list.rs [144:187]
fn next(&mut self) -> Result<Option<oio::Entry>> {
loop {
if let Some(de) = self.next_dir.take() {
let (_, mut l) = self.acc.blocking_list(de.path(), OpList::new())?;
if let Some(v) = l.next()? {
self.active_lister.push((Some(de.clone()), l));
if v.mode().is_dir() {
// should not loop itself again
if v.path() != de.path() {
self.next_dir = Some(v);
continue;
}
} else {
return Ok(Some(v));
}
}
}
let (de, lister) = match self.active_lister.last_mut() {
Some((de, lister)) => (de, lister),
None => return Ok(None),
};
match lister.next()? {
Some(v) if v.mode().is_dir() => {
if v.path() != de.as_ref().expect("de should not be none here").path() {
self.next_dir = Some(v);
continue;
}
}
Some(v) => return Ok(Some(v)),
None => match de.take() {
Some(de) => {
return Ok(Some(de));
}
None => {
let _ = self.active_lister.pop();
continue;
}
},
}
}
}