aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Tolmachov <me@igorek.dev>2023-08-29 20:24:44 +0900
committerIgor Tolmachev <me@igorek.dev>2024-06-23 15:34:33 +0900
commitf02a44964a2fdb91d62dee9c55f6d03648f985cb (patch)
tree4e1e91ab8cc19a9a9f2dfdd03c0ecbc2b6da2a14
parentd8be93a740e8cc8103c4f9e260a62244eba1a6a4 (diff)
downloadarchivator-f02a44964a2fdb91d62dee9c55f6d03648f985cb.tar.gz
archivator-f02a44964a2fdb91d62dee9c55f6d03648f985cb.zip
Add zip stubs
-rw-r--r--.vscode/settings.json2
-rw-r--r--src/archive.rs10
-rw-r--r--src/file.rs11
-rw-r--r--src/io.rs16
-rw-r--r--src/lib.rs4
-rw-r--r--src/zip.rs28
-rw-r--r--src/zip/archive.rs0
-rw-r--r--src/zip/file.rs44
-rw-r--r--src/zip/io.rs50
-rw-r--r--src/zip/mod.rs5
10 files changed, 132 insertions, 38 deletions
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 065d76f..94bf061 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,4 +1,4 @@
1{ 1{
2 "cSpell.words": ["archivator"], 2 "cSpell.words": ["archivator"],
3 "rust-analyzer.linkedProjects": ["./Cargo.toml"] 3 "rust-analyzer.linkedProjects": ["./Cargo.toml", "./Cargo.toml"]
4} 4}
diff --git a/src/archive.rs b/src/archive.rs
index a1fe344..3c2106a 100644
--- a/src/archive.rs
+++ b/src/archive.rs
@@ -1,14 +1,14 @@
1use crate::result::ArchiveResult;
2use std::{fs::File, path::Path};
3
4use crate::io::{ArchiveRead, ArchiveWrite}; 1use crate::io::{ArchiveRead, ArchiveWrite};
2use crate::result::ArchiveResult;
3use std::fs::File;
4use std::path::Path;
5 5
6pub struct Archive<IO> { 6pub struct Archive<IO> {
7 io: IO, 7 io: IO,
8} 8}
9 9
10impl<IO: ArchiveRead> Archive<IO> { 10impl<IO: ArchiveRead> Archive<IO> {
11 pub fn open(path: impl AsRef<Path>) -> ArchiveResult<Self> 11 pub fn file_reader(path: impl AsRef<Path>) -> ArchiveResult<Self>
12 where 12 where
13 IO: ArchiveRead<Reader = File>, 13 IO: ArchiveRead<Reader = File>,
14 { 14 {
@@ -23,7 +23,7 @@ impl<IO: ArchiveRead> Archive<IO> {
23} 23}
24 24
25impl<IO: ArchiveWrite> Archive<IO> { 25impl<IO: ArchiveWrite> Archive<IO> {
26 pub fn create(path: impl AsRef<Path>) -> ArchiveResult<Self> 26 pub fn file_writer(path: impl AsRef<Path>) -> ArchiveResult<Self>
27 where 27 where
28 IO: ArchiveWrite<Writer = File>, 28 IO: ArchiveWrite<Writer = File>,
29 { 29 {
diff --git a/src/file.rs b/src/file.rs
new file mode 100644
index 0000000..72a9eac
--- /dev/null
+++ b/src/file.rs
@@ -0,0 +1,11 @@
1use std::io::{Read, Write};
2
3pub trait ArchiveFile {
4 type Info;
5
6 fn info() -> Self::Info;
7}
8
9pub trait ArchiveFileRead: Read + ArchiveFile {}
10
11pub trait ArchiveFileWrite: Write + ArchiveFile {}
diff --git a/src/io.rs b/src/io.rs
index cea998f..df81ce0 100644
--- a/src/io.rs
+++ b/src/io.rs
@@ -1,14 +1,20 @@
1use std::io::{Read, Seek, Write}; 1use crate::file::{ArchiveFileRead, ArchiveFileWrite};
2
3use crate::result::ArchiveResult; 2use crate::result::ArchiveResult;
3use std::io::{Read, Write};
4 4
5pub trait ArchiveRead 5pub trait ArchiveRead
6where 6where
7 Self: Sized, 7 Self: Sized,
8{ 8{
9 type Reader: Read + Seek; 9 type Reader: Read;
10 type FileInfo;
11 type FileReader: ArchiveFileRead<Info = Self::FileInfo>;
10 12
11 fn new(reader: Self::Reader) -> ArchiveResult<Self>; 13 fn new(reader: Self::Reader) -> ArchiveResult<Self>;
14
15 fn files(&self) -> ArchiveResult<Vec<Self::FileInfo>>;
16
17 fn file_reader(&self, name: &str) -> ArchiveResult<Self::FileReader>;
12} 18}
13 19
14pub trait ArchiveWrite 20pub trait ArchiveWrite
@@ -16,6 +22,10 @@ where
16 Self: Sized, 22 Self: Sized,
17{ 23{
18 type Writer: Write; 24 type Writer: Write;
25 type FileInfo;
26 type FileWriter: ArchiveFileWrite<Info = Self::FileInfo>;
19 27
20 fn new(write: Self::Writer) -> ArchiveResult<Self>; 28 fn new(write: Self::Writer) -> ArchiveResult<Self>;
29
30 fn file_writer(&self, name: &str) -> ArchiveResult<Self::FileWriter>;
21} 31}
diff --git a/src/lib.rs b/src/lib.rs
index 04496fd..163f760 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,7 +1,9 @@
1pub mod zip; 1pub mod zip;
2 2
3mod result;
4
3mod archive; 5mod archive;
6mod file;
4mod io; 7mod io;
5mod result;
6 8
7pub use archive::Archive; 9pub use archive::Archive;
diff --git a/src/zip.rs b/src/zip.rs
deleted file mode 100644
index a5d0fc5..0000000
--- a/src/zip.rs
+++ /dev/null
@@ -1,28 +0,0 @@
1use crate::io::{ArchiveRead, ArchiveWrite};
2use crate::result::ArchiveResult;
3use std::io::{Seek, Write};
4use std::{fs::File, io::Read};
5
6pub struct ZipReader<R: Read + Seek = File> {
7 reader: R,
8}
9
10impl<R: Read + Seek> ArchiveRead for ZipReader<R> {
11 type Reader = R;
12
13 fn new(reader: Self::Reader) -> ArchiveResult<Self> {
14 Ok(Self { reader })
15 }
16}
17
18pub struct ZipWriter<W: Write = File> {
19 writer: W,
20}
21
22impl<W: Write> ArchiveWrite for ZipWriter<W> {
23 type Writer = W;
24
25 fn new(writer: Self::Writer) -> ArchiveResult<Self> {
26 Ok(Self { writer })
27 }
28}
diff --git a/src/zip/archive.rs b/src/zip/archive.rs
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/zip/archive.rs
diff --git a/src/zip/file.rs b/src/zip/file.rs
new file mode 100644
index 0000000..dba8d06
--- /dev/null
+++ b/src/zip/file.rs
@@ -0,0 +1,44 @@
1use crate::file::{ArchiveFile, ArchiveFileRead, ArchiveFileWrite};
2use std::io::{Read, Write};
3
4pub struct FileInfo {}
5
6pub struct FileReader {}
7
8pub struct FileWriter {}
9
10impl ArchiveFile for FileReader {
11 type Info = FileInfo;
12
13 fn info() -> Self::Info {
14 Self::Info {}
15 }
16}
17
18impl Read for FileReader {
19 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
20 return Ok(0);
21 }
22}
23
24impl ArchiveFileRead for FileReader {}
25
26impl ArchiveFile for FileWriter {
27 type Info = FileInfo;
28
29 fn info() -> Self::Info {
30 Self::Info {}
31 }
32}
33
34impl Write for FileWriter {
35 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
36 return Ok(0);
37 }
38
39 fn flush(&mut self) -> std::io::Result<()> {
40 Ok(())
41 }
42}
43
44impl ArchiveFileWrite for FileWriter {}
diff --git a/src/zip/io.rs b/src/zip/io.rs
new file mode 100644
index 0000000..b79ad0d
--- /dev/null
+++ b/src/zip/io.rs
@@ -0,0 +1,50 @@
1use super::file::{FileInfo, FileReader, FileWriter};
2use crate::io::{ArchiveRead, ArchiveWrite};
3use crate::result::ArchiveResult;
4use std::fs::File;
5use std::io::Read;
6use std::io::{Seek, Write};
7
8pub struct Reader<R: Read + Seek = File> {
9 reader: R,
10}
11
12impl<R: Read + Seek> ArchiveRead for Reader<R> {
13 type Reader = R;
14 type FileInfo = FileInfo;
15 type FileReader = FileReader;
16
17 fn new(reader: Self::Reader) -> ArchiveResult<Self> {
18 Ok(Self { reader })
19 }
20
21 fn files(&self) -> ArchiveResult<Vec<Self::FileInfo>> {
22 Ok(Vec::new())
23 }
24
25 fn file_reader(&self, name: &str) -> ArchiveResult<Self::FileReader> {
26 Ok(Self::FileReader {})
27 }
28}
29
30impl<R: Read + Seek> Reader<R> {}
31
32pub struct Writer<W: Write = File> {
33 writer: W,
34}
35
36impl<W: Write> ArchiveWrite for Writer<W> {
37 type Writer = W;
38 type FileInfo = FileInfo;
39 type FileWriter = FileWriter;
40
41 fn new(writer: Self::Writer) -> ArchiveResult<Self> {
42 Ok(Self { writer })
43 }
44
45 fn file_writer(&self, name: &str) -> ArchiveResult<Self::FileWriter> {
46 Ok(Self::FileWriter {})
47 }
48}
49
50impl<W: Write> Writer<W> {}
diff --git a/src/zip/mod.rs b/src/zip/mod.rs
new file mode 100644
index 0000000..5241c87
--- /dev/null
+++ b/src/zip/mod.rs
@@ -0,0 +1,5 @@
1mod archive;
2mod file;
3mod io;
4
5pub use io::{Reader, Writer};