use crate::driver::{ArchiveRead, ArchiveWrite, Driver}; use crate::{ArchiveFile, ArchiveResult}; use std::fs::File; use std::io::{Read, Write}; use std::path::Path; pub struct Archive { pub(crate) driver: D, } impl Archive where D::Io: std::io::Read, { pub fn read(io: D::Io) -> ArchiveResult { Ok(Self { driver: D::read(io)?, }) } pub fn read_from_file(path: impl AsRef) -> ArchiveResult where D: ArchiveRead, { Self::read(File::open(path)?) } pub fn files(&self) -> Vec<&D::FileInfo> { self.driver.files() } pub fn get_file_info(&self, name: &str) -> ArchiveResult<&D::FileInfo, D::Error> { self.driver.get_file_info(name) } pub fn get_file_reader<'d>( &'d mut self, name: &str, ) -> ArchiveResult>, D::Error> { Ok(ArchiveFile::new(self.driver.get_file_reader(name)?)) } } impl Archive where D::Io: Read + Write {}