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)?, }) } #[inline] pub fn read_from_file(path: impl AsRef) -> ArchiveResult where D: ArchiveRead, { Self::read(File::open(path)?) } pub fn files(&self) -> &Vec { self.driver.files() } #[inline] pub fn len(&self) -> usize { self.files().len() } pub fn get_file_index(&self, name: &str) -> ArchiveResult { self.driver.get_file_index(name) } pub fn get_file_info_by_index(&self, index: usize) -> ArchiveResult<&D::FileInfo, D::Error> { self.driver.get_file_info(index) } #[inline] pub fn get_file_info_by_name(&self, name: &str) -> ArchiveResult<&D::FileInfo, D::Error> { self.get_file_info_by_index(self.get_file_index(name)?) } pub fn get_file_reader_by_index<'d>( &'d mut self, index: usize, ) -> ArchiveResult>, D::Error> { Ok(ArchiveFile::new(self.driver.get_file_reader(index)?)) } #[inline] pub fn get_file_reader_by_name<'d>( &'d mut self, name: &str, ) -> ArchiveResult>, D::Error> { self.get_file_reader_by_index(self.get_file_index(name)?) } } impl Archive where D::Io: Read + Write {}