use crate::inventory::{Entry, Inventory};
use crate::FileId;
fn absent_or_err(e: crate::inventory::Error) -> Result<(), crate::inventory::Error> {
match e {
crate::inventory::Error::NoSuchId(_) => Ok(()),
other => Err(other),
}
}
pub struct RevisionTree {
revision_id: Vec<u8>,
inventory: Box<dyn Inventory>,
}
impl RevisionTree {
pub(super) fn new(revision_id: Vec<u8>, inventory: Box<dyn Inventory>) -> Self {
RevisionTree {
revision_id,
inventory,
}
}
pub fn revision_id(&self) -> &[u8] {
&self.revision_id
}
pub fn inventory(&self) -> &dyn Inventory {
self.inventory.as_ref()
}
pub fn id2path(&self, file_id: &FileId) -> Result<Option<String>, crate::inventory::Error> {
match self.inventory.id2path(file_id) {
Ok(p) => Ok(Some(p)),
Err(e) => absent_or_err(e).map(|()| None),
}
}
pub fn path2id(&self, path: &str) -> Option<FileId> {
let path = path.trim_matches('/');
for (entry_path, entry) in self.inventory.entries().ok()? {
if entry_path == path {
return Some(entry.file_id().clone());
}
}
None
}
pub fn iter_entries(&self) -> Vec<(String, Entry)> {
self.inventory.entries().unwrap_or_default()
}
pub fn get_entry(&self, file_id: &FileId) -> Result<Option<Entry>, crate::inventory::Error> {
self.inventory.get_entry(file_id)
}
pub fn get_file_revision(
&self,
file_id: &FileId,
) -> Result<Option<Vec<u8>>, crate::inventory::Error> {
Ok(self
.get_entry(file_id)?
.and_then(|e| e.revision().map(|r| r.as_bytes().to_vec())))
}
}