logsmash/src/logfile/archive/rar.rs

51 lines
1.3 KiB
Rust

use crate::error::ReadError;
use crate::logfile::archive::{Archive, ArchiveEntry};
use std::borrow::Cow;
pub struct RarArchive {
path: String,
}
impl RarArchive {
pub fn new(path: &str) -> Result<Self, ReadError> {
Ok(RarArchive { path: path.into() })
}
}
pub struct RarEntry {
archive: String,
name: String,
}
impl ArchiveEntry for RarEntry {
fn name<'a>(&'a self) -> Cow<'a, str> {
self.name.as_str().into()
}
fn extract(self) -> Result<Vec<u8>, ReadError> {
let mut archive = unrar::Archive::new(&self.archive).open_for_processing()?;
while let Some(header) = archive.read_header()? {
if header.entry().filename.to_string_lossy() == self.name {
return Ok(header.read()?.0);
}
archive = header.skip()?;
}
Err(ReadError::NoFiles)
}
}
impl Archive for RarArchive {
type Entry<'a> = RarEntry;
fn entries(&mut self) -> impl Iterator<Item = Self::Entry<'_>> {
unrar::Archive::new(&self.path)
.open_for_listing()
.into_iter()
.flatten()
.flatten()
.map(|header| RarEntry {
archive: self.path.clone(),
name: header.filename.to_string_lossy().into(),
})
}
}