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 { 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, 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> { 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(), }) } }