Implement Fs::child_entries for InMemoryFs

This commit is contained in:
Antonio Scandurra 2021-07-09 16:41:05 +02:00
parent b96578f471
commit 63e76e426a

View File

@ -14,7 +14,7 @@ use crate::{
use ::ignore::gitignore::Gitignore;
use anyhow::{anyhow, Context, Result};
use atomic::Ordering::SeqCst;
use futures::{Stream, StreamExt};
use futures::{future, stream, Stream, StreamExt};
pub use fuzzy::{match_paths, PathMatch};
use gpui::{
executor, AppContext, AsyncAppContext, Entity, ModelContext, ModelHandle, MutableAppContext,
@ -187,6 +187,7 @@ impl Fs for OsFs {
}
}
#[derive(Clone)]
struct InMemoryEntry {
inode: u64,
mtime: SystemTime,
@ -334,7 +335,27 @@ impl Fs for InMemoryFs {
path: &'a Path,
abs_path: &'a Path,
) -> Result<Pin<Box<dyn 'a + Stream<Item = Result<Entry>> + Send>>> {
todo!()
let state = self.state.read().await;
Ok(stream::iter(state.entries.clone())
.filter(move |(child_path, _)| future::ready(child_path.parent() == Some(abs_path)))
.then(move |(child_abs_path, child_entry)| async move {
smol::future::yield_now().await;
let child_path = Arc::from(path.join(child_abs_path.file_name().unwrap()));
Ok(Entry {
id: next_entry_id.fetch_add(1, SeqCst),
kind: if child_entry.is_dir {
EntryKind::PendingDir
} else {
EntryKind::File(char_bag_for_path(root_char_bag, &child_path))
},
path: child_path,
inode: child_entry.inode,
mtime: child_entry.mtime,
is_symlink: child_entry.is_symlink,
is_ignored: false,
})
})
.boxed())
}
async fn load(&self, path: &Path) -> Result<String> {