aboutsummaryrefslogtreecommitdiff
path: root/src/driver
diff options
context:
space:
mode:
authorIgor Tolmachev <me@igorek.dev>2024-06-27 16:15:00 +0900
committerIgor Tolmachev <me@igorek.dev>2024-06-29 21:18:46 +0900
commit51694e1f0b2730915e0a57ec6d8de503cf06ef9a (patch)
tree165f3adbc29f96814b57aeba394fb4045af7c5f0 /src/driver
parenta867677218c1d55dadfcac1ca5b8cd32a78a3c28 (diff)
downloadarchivator-51694e1f0b2730915e0a57ec6d8de503cf06ef9a.tar.gz
archivator-51694e1f0b2730915e0a57ec6d8de503cf06ef9a.zip
Create file driver and implement file reader
Diffstat (limited to 'src/driver')
-rw-r--r--src/driver/driver.rs27
-rw-r--r--src/driver/file.rs9
-rw-r--r--src/driver/mod.rs2
3 files changed, 26 insertions, 12 deletions
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 @@
1use crate::driver::ArchiveFile; 1use crate::driver::{ArchiveFileInfo, FileDriver};
2use crate::ArchiveResult; 2use crate::ArchiveResult;
3use std::error::Error; 3use std::error::Error;
4use std::io::{Read, Write}; 4use std::io::{Read, Write};
@@ -6,26 +6,33 @@ use std::io::{Read, Write};
6pub trait Driver: Sized { 6pub trait Driver: Sized {
7 type Error: Error; 7 type Error: Error;
8 8
9 type IO; 9 type Io;
10 type File: ArchiveFile; 10 type FileInfo: ArchiveFileInfo;
11 type FileDriver<'d>: FileDriver
12 where
13 Self::FileInfo: 'd,
14 Self::Io: 'd;
11} 15}
12 16
13pub trait ArchiveRead: Driver 17pub trait ArchiveRead: Driver
14where 18where
15 Self::IO: Read, 19 Self::Io: Read,
16{ 20{
17 // Create driver instance 21 // Create driver instance
18 fn read(io: Self::IO) -> ArchiveResult<Self, Self::Error>; 22 fn read(io: Self::Io) -> ArchiveResult<Self, Self::Error>;
19 23
20 // Return vec of files (sorted by name) 24 // Return vec of files (sorted by name)
21 fn files(&self) -> Vec<&Self::File>; 25 fn files(&self) -> Vec<&Self::FileInfo>;
22 26
23 // Return file by name 27 // Return file info by name
24 fn get_file(&self, name: &str) -> Option<&Self::File>; 28 fn get_file_info(&self, name: &str) -> Option<&Self::FileInfo>;
29
30 // Return file reader by name
31 fn get_file_reader<'d>(&'d mut self, name: &str) -> Option<Self::FileDriver<'d>>;
25} 32}
26 33
27pub trait ArchiveWrite: ArchiveRead 34pub trait ArchiveWrite: Driver
28where 35where
29 Self::IO: Read + Write, 36 Self::Io: Read + Write,
30{ 37{
31} 38}
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 @@
1pub trait ArchiveFile {} 1pub trait ArchiveFileInfo {}
2
3pub trait FileDriver {
4 type Io;
5 type FileInfo: ArchiveFileInfo;
6
7 fn info(&self) -> &Self::FileInfo;
8}
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;
2mod file; 2mod file;
3 3
4pub use driver::{ArchiveRead, ArchiveWrite, Driver}; 4pub use driver::{ArchiveRead, ArchiveWrite, Driver};
5pub use file::ArchiveFile; 5pub use file::{ArchiveFileInfo, FileDriver};