Impl new type Vfs which impl AbstractFilesystem

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
Jiahao XU 2022-06-12 01:57:34 +10:00
parent c6687edf48
commit 3c30722a06
No known key found for this signature in database
GPG key ID: 591C0B03040416D6
2 changed files with 41 additions and 0 deletions

View file

@ -8,6 +8,8 @@ pub use cratesio::*;
mod version; mod version;
use version::find_version; use version::find_version;
mod vfs;
/// Fetch a crate by name and version from github /// Fetch a crate by name and version from github
/// TODO: implement this /// TODO: implement this
pub async fn fetch_crate_gh_releases( pub async fn fetch_crate_gh_releases(

39
src/drivers/vfs.rs Normal file
View file

@ -0,0 +1,39 @@
use std::collections::{hash_map::HashMap, hash_set::HashSet};
use std::io;
use std::path::Path;
use cargo_toml::AbstractFilesystem;
use crate::helpers::PathExt;
#[derive(Debug)]
pub(super) struct Vfs(HashMap<Box<Path>, HashSet<Box<str>>>);
impl Vfs {
pub(super) fn new() -> Self {
Self(HashMap::with_capacity(16))
}
/// * `path` - must be canonical, must not be empty and must
/// start with a prefix.
pub(super) fn add_path(&mut self, mut path: &Path) {
while let Some(parent) = path.parent() {
if let Some(path_str) = path.to_str() {
self.0
.entry(parent.into())
.or_insert_with(|| HashSet::with_capacity(4))
.insert(path_str.into());
}
path = parent;
}
}
}
impl AbstractFilesystem for Vfs {
fn file_names_in(&self, rel_path: &str) -> io::Result<HashSet<Box<str>>> {
let rel_path = Path::new(rel_path).normalize_path();
Ok(self.0.get(&*rel_path).map(Clone::clone).unwrap_or_default())
}
}