2024-11-17 22:34:43 +01:00
|
|
|
use std::fmt;
|
|
|
|
|
|
2024-11-23 20:43:26 +01:00
|
|
|
use super::{Dir, DirEntry, DynDir, EditPath, ImageSize, VPath, VPathBuf};
|
2024-11-17 22:34:43 +01:00
|
|
|
|
|
|
|
|
pub struct Overlay {
|
|
|
|
|
base: DynDir,
|
|
|
|
|
overlay: DynDir,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Overlay {
|
|
|
|
|
pub fn new(base: DynDir, overlay: DynDir) -> Self {
|
|
|
|
|
Self { base, overlay }
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Dir for Overlay {
|
|
|
|
|
fn dir(&self, path: &VPath) -> Vec<DirEntry> {
|
|
|
|
|
let mut dir = self.base.dir(path);
|
|
|
|
|
dir.append(&mut self.overlay.dir(path));
|
|
|
|
|
dir.sort();
|
|
|
|
|
dir.dedup();
|
|
|
|
|
dir
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn content(&self, path: &VPath) -> Option<Vec<u8>> {
|
|
|
|
|
self.overlay
|
|
|
|
|
.content(path)
|
|
|
|
|
.or_else(|| self.base.content(path))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn content_version(&self, path: &VPath) -> Option<String> {
|
|
|
|
|
self.overlay
|
|
|
|
|
.content_version(path)
|
|
|
|
|
.or_else(|| self.base.content_version(path))
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-23 20:43:26 +01:00
|
|
|
fn image_size(&self, path: &VPath) -> Option<ImageSize> {
|
|
|
|
|
self.overlay
|
|
|
|
|
.image_size(path)
|
|
|
|
|
.or_else(|| self.base.image_size(path))
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-17 22:34:43 +01:00
|
|
|
fn anchor(&self, path: &VPath) -> Option<VPathBuf> {
|
|
|
|
|
self.overlay.anchor(path).or_else(|| self.base.anchor(path))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn edit_path(&self, path: &VPath) -> Option<EditPath> {
|
|
|
|
|
self.overlay
|
|
|
|
|
.edit_path(path)
|
|
|
|
|
.or_else(|| self.base.edit_path(path))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl fmt::Debug for Overlay {
|
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
|
|
|
write!(f, "Overlay({:?}, {:?})", self.base, self.overlay)
|
|
|
|
|
}
|
|
|
|
|
}
|