treehouse/src/vfs/overlay.rs

41 lines
930 B
Rust
Raw Normal View History

use std::fmt;
use tracing::instrument;
use super::{entries, Dir, DynDir, Entries, Query, VPath, VPathBuf};
pub struct Overlay {
base: DynDir,
overlay: DynDir,
}
impl Overlay {
pub fn new(base: DynDir, overlay: DynDir) -> Self {
Self { base, overlay }
}
#[instrument("Overlay::dir", skip(self))]
fn dir(&self, path: &VPath) -> Vec<VPathBuf> {
let mut dir = entries(&self.base, path);
dir.append(&mut entries(&self.overlay, path));
dir.sort();
dir.dedup();
dir
}
}
impl Dir for Overlay {
fn query(&self, path: &VPath, query: &mut Query) {
query.provide(|| Entries(self.dir(path)));
self.overlay.query(path, query);
self.base.query(path, query);
}
}
impl fmt::Debug for Overlay {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Overlay({:?}, {:?})", self.base, self.overlay)
}
}