mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-04-21 04:58:42 +00:00
Impl new type Vfs
which impl AbstractFilesystem
Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
parent
c6687edf48
commit
3c30722a06
2 changed files with 41 additions and 0 deletions
|
@ -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
39
src/drivers/vfs.rs
Normal 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())
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue