diff options
| author | Igor Tolmachov <me@igorek.dev> | 2023-08-29 20:24:44 +0900 |
|---|---|---|
| committer | Igor Tolmachev <me@igorek.dev> | 2024-06-23 15:34:33 +0900 |
| commit | f02a44964a2fdb91d62dee9c55f6d03648f985cb (patch) | |
| tree | 4e1e91ab8cc19a9a9f2dfdd03c0ecbc2b6da2a14 | |
| parent | d8be93a740e8cc8103c4f9e260a62244eba1a6a4 (diff) | |
| download | archivator-f02a44964a2fdb91d62dee9c55f6d03648f985cb.tar.gz archivator-f02a44964a2fdb91d62dee9c55f6d03648f985cb.zip | |
Add zip stubs
| -rw-r--r-- | .vscode/settings.json | 2 | ||||
| -rw-r--r-- | src/archive.rs | 10 | ||||
| -rw-r--r-- | src/file.rs | 11 | ||||
| -rw-r--r-- | src/io.rs | 16 | ||||
| -rw-r--r-- | src/lib.rs | 4 | ||||
| -rw-r--r-- | src/zip.rs | 28 | ||||
| -rw-r--r-- | src/zip/archive.rs | 0 | ||||
| -rw-r--r-- | src/zip/file.rs | 44 | ||||
| -rw-r--r-- | src/zip/io.rs | 50 | ||||
| -rw-r--r-- | src/zip/mod.rs | 5 |
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 @@ | |||
| 1 | use crate::result::ArchiveResult; | ||
| 2 | use std::{fs::File, path::Path}; | ||
| 3 | |||
| 4 | use crate::io::{ArchiveRead, ArchiveWrite}; | 1 | use crate::io::{ArchiveRead, ArchiveWrite}; |
| 2 | use crate::result::ArchiveResult; | ||
| 3 | use std::fs::File; | ||
| 4 | use std::path::Path; | ||
| 5 | 5 | ||
| 6 | pub struct Archive<IO> { | 6 | pub struct Archive<IO> { |
| 7 | io: IO, | 7 | io: IO, |
| 8 | } | 8 | } |
| 9 | 9 | ||
| 10 | impl<IO: ArchiveRead> Archive<IO> { | 10 | impl<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 | ||
| 25 | impl<IO: ArchiveWrite> Archive<IO> { | 25 | impl<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 @@ | |||
| 1 | use std::io::{Read, Write}; | ||
| 2 | |||
| 3 | pub trait ArchiveFile { | ||
| 4 | type Info; | ||
| 5 | |||
| 6 | fn info() -> Self::Info; | ||
| 7 | } | ||
| 8 | |||
| 9 | pub trait ArchiveFileRead: Read + ArchiveFile {} | ||
| 10 | |||
| 11 | pub trait ArchiveFileWrite: Write + ArchiveFile {} | ||
| @@ -1,14 +1,20 @@ | |||
| 1 | use std::io::{Read, Seek, Write}; | 1 | use crate::file::{ArchiveFileRead, ArchiveFileWrite}; |
| 2 | |||
| 3 | use crate::result::ArchiveResult; | 2 | use crate::result::ArchiveResult; |
| 3 | use std::io::{Read, Write}; | ||
| 4 | 4 | ||
| 5 | pub trait ArchiveRead | 5 | pub trait ArchiveRead |
| 6 | where | 6 | where |
| 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 | ||
| 14 | pub trait ArchiveWrite | 20 | pub 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 | } |
| @@ -1,7 +1,9 @@ | |||
| 1 | pub mod zip; | 1 | pub mod zip; |
| 2 | 2 | ||
| 3 | mod result; | ||
| 4 | |||
| 3 | mod archive; | 5 | mod archive; |
| 6 | mod file; | ||
| 4 | mod io; | 7 | mod io; |
| 5 | mod result; | ||
| 6 | 8 | ||
| 7 | pub use archive::Archive; | 9 | pub 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 @@ | |||
| 1 | use crate::io::{ArchiveRead, ArchiveWrite}; | ||
| 2 | use crate::result::ArchiveResult; | ||
| 3 | use std::io::{Seek, Write}; | ||
| 4 | use std::{fs::File, io::Read}; | ||
| 5 | |||
| 6 | pub struct ZipReader<R: Read + Seek = File> { | ||
| 7 | reader: R, | ||
| 8 | } | ||
| 9 | |||
| 10 | impl<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 | |||
| 18 | pub struct ZipWriter<W: Write = File> { | ||
| 19 | writer: W, | ||
| 20 | } | ||
| 21 | |||
| 22 | impl<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 @@ | |||
| 1 | use crate::file::{ArchiveFile, ArchiveFileRead, ArchiveFileWrite}; | ||
| 2 | use std::io::{Read, Write}; | ||
| 3 | |||
| 4 | pub struct FileInfo {} | ||
| 5 | |||
| 6 | pub struct FileReader {} | ||
| 7 | |||
| 8 | pub struct FileWriter {} | ||
| 9 | |||
| 10 | impl ArchiveFile for FileReader { | ||
| 11 | type Info = FileInfo; | ||
| 12 | |||
| 13 | fn info() -> Self::Info { | ||
| 14 | Self::Info {} | ||
| 15 | } | ||
| 16 | } | ||
| 17 | |||
| 18 | impl Read for FileReader { | ||
| 19 | fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> { | ||
| 20 | return Ok(0); | ||
| 21 | } | ||
| 22 | } | ||
| 23 | |||
| 24 | impl ArchiveFileRead for FileReader {} | ||
| 25 | |||
| 26 | impl ArchiveFile for FileWriter { | ||
| 27 | type Info = FileInfo; | ||
| 28 | |||
| 29 | fn info() -> Self::Info { | ||
| 30 | Self::Info {} | ||
| 31 | } | ||
| 32 | } | ||
| 33 | |||
| 34 | impl 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 | |||
| 44 | impl 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 @@ | |||
| 1 | use super::file::{FileInfo, FileReader, FileWriter}; | ||
| 2 | use crate::io::{ArchiveRead, ArchiveWrite}; | ||
| 3 | use crate::result::ArchiveResult; | ||
| 4 | use std::fs::File; | ||
| 5 | use std::io::Read; | ||
| 6 | use std::io::{Seek, Write}; | ||
| 7 | |||
| 8 | pub struct Reader<R: Read + Seek = File> { | ||
| 9 | reader: R, | ||
| 10 | } | ||
| 11 | |||
| 12 | impl<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 | |||
| 30 | impl<R: Read + Seek> Reader<R> {} | ||
| 31 | |||
| 32 | pub struct Writer<W: Write = File> { | ||
| 33 | writer: W, | ||
| 34 | } | ||
| 35 | |||
| 36 | impl<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 | |||
| 50 | impl<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 @@ | |||
| 1 | mod archive; | ||
| 2 | mod file; | ||
| 3 | mod io; | ||
| 4 | |||
| 5 | pub use io::{Reader, Writer}; | ||
