use crate::{
ByteSourceHandle, FormatDescriptor, NamespaceDirectoryEntry, NamespaceNodeId, NamespaceNodeKind,
NamespaceNodeRecord, NamespaceStreamId, NamespaceStreamRecord, Result,
};
#[allow(dead_code)]
pub(crate) trait Archive: Send + Sync {
fn descriptor(&self) -> FormatDescriptor;
fn root_entry_id(&self) -> NamespaceNodeId;
fn entry(&self, entry_id: &NamespaceNodeId) -> Result<NamespaceNodeRecord>;
fn read_dir(&self, directory_id: &NamespaceNodeId) -> Result<Vec<NamespaceDirectoryEntry>>;
fn open_file(&self, entry_id: &NamespaceNodeId) -> Result<ByteSourceHandle>;
fn is_locked(&self) -> bool {
false
}
fn unlock_with_password(&mut self, _password: &str) -> Result<bool> {
Ok(false)
}
fn data_streams(&self, entry_id: &NamespaceNodeId) -> Result<Vec<NamespaceStreamRecord>> {
let entry = self.entry(entry_id)?;
Ok(match entry.kind {
NamespaceNodeKind::File | NamespaceNodeKind::Symlink => {
vec![NamespaceStreamRecord::new(
NamespaceStreamId::data(),
entry.size,
)]
}
NamespaceNodeKind::Directory | NamespaceNodeKind::Special => Vec::new(),
})
}
fn open_stream(
&self, entry_id: &NamespaceNodeId, stream_id: &NamespaceStreamId,
) -> Result<ByteSourceHandle> {
if *stream_id == NamespaceStreamId::data() {
self.open_file(entry_id)
} else {
Err(crate::Error::not_found(format!(
"{} does not expose stream {:?}",
self.descriptor().id,
stream_id
)))
}
}
}
macro_rules! impl_archive_data_source {
($ty:ty) => {
impl crate::NamespaceSource for $ty {
fn root_node_id(&self) -> crate::NamespaceNodeId {
crate::archives::driver::Archive::root_entry_id(self)
}
fn node(
&self, node_id: &crate::NamespaceNodeId,
) -> crate::Result<crate::NamespaceNodeRecord> {
crate::archives::driver::Archive::entry(self, node_id)
}
fn read_dir(
&self, directory_id: &crate::NamespaceNodeId,
) -> crate::Result<Vec<crate::NamespaceDirectoryEntry>> {
crate::archives::driver::Archive::read_dir(self, directory_id)
}
fn data_streams(
&self, node_id: &crate::NamespaceNodeId,
) -> crate::Result<Vec<crate::NamespaceStreamRecord>> {
crate::archives::driver::Archive::data_streams(self, node_id)
}
fn open_stream(
&self, node_id: &crate::NamespaceNodeId, stream_id: &crate::NamespaceStreamId,
) -> crate::Result<crate::ByteSourceHandle> {
crate::archives::driver::Archive::open_stream(self, node_id, stream_id)
}
}
impl crate::DataSource for $ty {
fn descriptor(&self) -> crate::FormatDescriptor {
crate::archives::driver::Archive::descriptor(self)
}
fn facets(&self) -> crate::DataSourceFacets {
crate::DataSourceFacets::namespace()
}
fn namespace(&self) -> Option<&dyn crate::NamespaceSource> {
Some(self)
}
}
};
}
pub(crate) use impl_archive_data_source;