From a867677218c1d55dadfcac1ca5b8cd32a78a3c28 Mon Sep 17 00:00:00 2001 From: Igor Tolmachev Date: Thu, 27 Jun 2024 00:22:52 +0900 Subject: Implement file getter in archive --- src/archive.rs | 21 +++++++++++++++++++-- src/driver/driver.rs | 6 ++++++ src/zip/archive.rs | 10 ++++++++++ src/zip/driver.rs | 21 +++++++++++++++++---- src/zip/file.rs | 2 +- src/zip/mod.rs | 3 ++- 6 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 src/zip/archive.rs (limited to 'src') diff --git a/src/archive.rs b/src/archive.rs index fe03a12..e635007 100644 --- a/src/archive.rs +++ b/src/archive.rs @@ -1,20 +1,37 @@ use crate::driver::{ArchiveRead, ArchiveWrite, Driver}; use crate::ArchiveResult; +use std::fs::File; use std::io::{Read, Write}; +use std::path::Path; pub struct Archive { - pub driver: D, + pub(crate) driver: D, } impl Archive where D::IO: std::io::Read, { - pub fn new(io: D::IO) -> ArchiveResult { + 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::File> { + self.driver.files() + } + + pub fn get_file(&self, name: &str) -> Option<&D::File> { + self.driver.get_file(name) + } } impl Archive where D::IO: Read + Write {} diff --git a/src/driver/driver.rs b/src/driver/driver.rs index 3a8ed16..9c18e1f 100644 --- a/src/driver/driver.rs +++ b/src/driver/driver.rs @@ -16,6 +16,12 @@ where { // Create driver instance fn read(io: Self::IO) -> ArchiveResult; + + // Return vec of files (sorted by name) + fn files(&self) -> Vec<&Self::File>; + + // Return file by name + fn get_file(&self, name: &str) -> Option<&Self::File>; } pub trait ArchiveWrite: ArchiveRead diff --git a/src/zip/archive.rs b/src/zip/archive.rs new file mode 100644 index 0000000..9a244fc --- /dev/null +++ b/src/zip/archive.rs @@ -0,0 +1,10 @@ +use crate::{Archive, Zip}; +use std::io::{Read, Seek, Write}; + +impl Archive> { + pub fn comment(&self) -> &String { + self.driver.comment() + } +} + +impl Archive> {} diff --git a/src/zip/driver.rs b/src/zip/driver.rs index 8662623..650344e 100644 --- a/src/zip/driver.rs +++ b/src/zip/driver.rs @@ -4,10 +4,9 @@ use crate::zip::structs::{deserialize, EOCDR64Locator, ExtraHeader, CDR, EOCDR, use crate::zip::{ZipError, ZipFile, ZipResult}; use chrono::{Local, NaiveDate, NaiveDateTime, NaiveTime}; use std::collections::HashMap as Map; -use std::fs::File; use std::io::{Read, Seek, SeekFrom, Write}; -pub struct Zip { +pub struct Zip { io: IO, files: Map, @@ -169,10 +168,24 @@ impl ArchiveRead for Zip { Ok(Self { io, files, comment }) } + + fn files(&self) -> Vec<&Self::File> { + let mut files: Vec<&Self::File> = self.files.values().collect(); + files.sort_by_key(|f| &f.name); + files + } + + fn get_file(&self, name: &str) -> Option<&Self::File> { + self.files.get(name) + } } -impl Zip {} +impl Zip { + pub fn comment(&self) -> &String { + &self.comment + } +} impl ArchiveWrite for Zip {} -impl Zip {} +impl Zip {} diff --git a/src/zip/file.rs b/src/zip/file.rs index b4f2d7c..5b0723f 100644 --- a/src/zip/file.rs +++ b/src/zip/file.rs @@ -29,7 +29,7 @@ impl CompressionMethod { } pub struct BitFlag { - pub flag: u16, + flag: u16, } pub mod bit { diff --git a/src/zip/mod.rs b/src/zip/mod.rs index 23cadb9..89d748b 100644 --- a/src/zip/mod.rs +++ b/src/zip/mod.rs @@ -1,3 +1,4 @@ +mod archive; mod driver; mod error; mod file; @@ -5,7 +6,7 @@ mod structs; pub use driver::Zip; pub use error::{ZipError, ZipResult}; -pub use file::ZipFile; +pub use file::{bit, BitFlag, CompressionMethod, ZipFile}; #[cfg(test)] mod tests; -- cgit v1.2.3