From 51694e1f0b2730915e0a57ec6d8de503cf06ef9a Mon Sep 17 00:00:00 2001 From: Igor Tolmachev Date: Thu, 27 Jun 2024 16:15:00 +0900 Subject: Create file driver and implement file reader --- src/driver/driver.rs | 27 +++++++++++++++++---------- src/driver/file.rs | 9 ++++++++- src/driver/mod.rs | 2 +- 3 files changed, 26 insertions(+), 12 deletions(-) (limited to 'src/driver') diff --git a/src/driver/driver.rs b/src/driver/driver.rs index 9c18e1f..5bd2319 100644 --- a/src/driver/driver.rs +++ b/src/driver/driver.rs @@ -1,4 +1,4 @@ -use crate::driver::ArchiveFile; +use crate::driver::{ArchiveFileInfo, FileDriver}; use crate::ArchiveResult; use std::error::Error; use std::io::{Read, Write}; @@ -6,26 +6,33 @@ use std::io::{Read, Write}; pub trait Driver: Sized { type Error: Error; - type IO; - type File: ArchiveFile; + type Io; + type FileInfo: ArchiveFileInfo; + type FileDriver<'d>: FileDriver + where + Self::FileInfo: 'd, + Self::Io: 'd; } pub trait ArchiveRead: Driver where - Self::IO: Read, + Self::Io: Read, { // Create driver instance - fn read(io: Self::IO) -> ArchiveResult; + fn read(io: Self::Io) -> ArchiveResult; // Return vec of files (sorted by name) - fn files(&self) -> Vec<&Self::File>; + fn files(&self) -> Vec<&Self::FileInfo>; - // Return file by name - fn get_file(&self, name: &str) -> Option<&Self::File>; + // Return file info by name + fn get_file_info(&self, name: &str) -> Option<&Self::FileInfo>; + + // Return file reader by name + fn get_file_reader<'d>(&'d mut self, name: &str) -> Option>; } -pub trait ArchiveWrite: ArchiveRead +pub trait ArchiveWrite: Driver where - Self::IO: Read + Write, + Self::Io: Read + Write, { } diff --git a/src/driver/file.rs b/src/driver/file.rs index a4974f3..125c9c3 100644 --- a/src/driver/file.rs +++ b/src/driver/file.rs @@ -1 +1,8 @@ -pub trait ArchiveFile {} +pub trait ArchiveFileInfo {} + +pub trait FileDriver { + type Io; + type FileInfo: ArchiveFileInfo; + + fn info(&self) -> &Self::FileInfo; +} diff --git a/src/driver/mod.rs b/src/driver/mod.rs index 36ee6b5..b637a34 100644 --- a/src/driver/mod.rs +++ b/src/driver/mod.rs @@ -2,4 +2,4 @@ mod driver; mod file; pub use driver::{ArchiveRead, ArchiveWrite, Driver}; -pub use file::ArchiveFile; +pub use file::{ArchiveFileInfo, FileDriver}; -- cgit v1.2.3