From f02a44964a2fdb91d62dee9c55f6d03648f985cb Mon Sep 17 00:00:00 2001 From: Igor Tolmachov Date: Tue, 29 Aug 2023 20:24:44 +0900 Subject: Add zip stubs --- src/archive.rs | 10 +++++----- src/file.rs | 11 +++++++++++ src/io.rs | 16 +++++++++++++--- src/lib.rs | 4 +++- src/zip.rs | 28 ---------------------------- src/zip/archive.rs | 0 src/zip/file.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/zip/io.rs | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/zip/mod.rs | 5 +++++ 9 files changed, 131 insertions(+), 37 deletions(-) create mode 100644 src/file.rs delete mode 100644 src/zip.rs create mode 100644 src/zip/archive.rs create mode 100644 src/zip/file.rs create mode 100644 src/zip/io.rs create mode 100644 src/zip/mod.rs (limited to 'src') 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 @@ -use crate::result::ArchiveResult; -use std::{fs::File, path::Path}; - use crate::io::{ArchiveRead, ArchiveWrite}; +use crate::result::ArchiveResult; +use std::fs::File; +use std::path::Path; pub struct Archive { io: IO, } impl Archive { - pub fn open(path: impl AsRef) -> ArchiveResult + pub fn file_reader(path: impl AsRef) -> ArchiveResult where IO: ArchiveRead, { @@ -23,7 +23,7 @@ impl Archive { } impl Archive { - pub fn create(path: impl AsRef) -> ArchiveResult + pub fn file_writer(path: impl AsRef) -> ArchiveResult where IO: ArchiveWrite, { 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 @@ +use std::io::{Read, Write}; + +pub trait ArchiveFile { + type Info; + + fn info() -> Self::Info; +} + +pub trait ArchiveFileRead: Read + ArchiveFile {} + +pub 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 @@ -use std::io::{Read, Seek, Write}; - +use crate::file::{ArchiveFileRead, ArchiveFileWrite}; use crate::result::ArchiveResult; +use std::io::{Read, Write}; pub trait ArchiveRead where Self: Sized, { - type Reader: Read + Seek; + type Reader: Read; + type FileInfo; + type FileReader: ArchiveFileRead; fn new(reader: Self::Reader) -> ArchiveResult; + + fn files(&self) -> ArchiveResult>; + + fn file_reader(&self, name: &str) -> ArchiveResult; } pub trait ArchiveWrite @@ -16,6 +22,10 @@ where Self: Sized, { type Writer: Write; + type FileInfo; + type FileWriter: ArchiveFileWrite; fn new(write: Self::Writer) -> ArchiveResult; + + fn file_writer(&self, name: &str) -> ArchiveResult; } 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 @@ pub mod zip; +mod result; + mod archive; +mod file; mod io; -mod result; 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 @@ -use crate::io::{ArchiveRead, ArchiveWrite}; -use crate::result::ArchiveResult; -use std::io::{Seek, Write}; -use std::{fs::File, io::Read}; - -pub struct ZipReader { - reader: R, -} - -impl ArchiveRead for ZipReader { - type Reader = R; - - fn new(reader: Self::Reader) -> ArchiveResult { - Ok(Self { reader }) - } -} - -pub struct ZipWriter { - writer: W, -} - -impl ArchiveWrite for ZipWriter { - type Writer = W; - - fn new(writer: Self::Writer) -> ArchiveResult { - Ok(Self { writer }) - } -} diff --git a/src/zip/archive.rs b/src/zip/archive.rs new file mode 100644 index 0000000..e69de29 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 @@ +use crate::file::{ArchiveFile, ArchiveFileRead, ArchiveFileWrite}; +use std::io::{Read, Write}; + +pub struct FileInfo {} + +pub struct FileReader {} + +pub struct FileWriter {} + +impl ArchiveFile for FileReader { + type Info = FileInfo; + + fn info() -> Self::Info { + Self::Info {} + } +} + +impl Read for FileReader { + fn read(&mut self, buf: &mut [u8]) -> std::io::Result { + return Ok(0); + } +} + +impl ArchiveFileRead for FileReader {} + +impl ArchiveFile for FileWriter { + type Info = FileInfo; + + fn info() -> Self::Info { + Self::Info {} + } +} + +impl Write for FileWriter { + fn write(&mut self, buf: &[u8]) -> std::io::Result { + return Ok(0); + } + + fn flush(&mut self) -> std::io::Result<()> { + Ok(()) + } +} + +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 @@ +use super::file::{FileInfo, FileReader, FileWriter}; +use crate::io::{ArchiveRead, ArchiveWrite}; +use crate::result::ArchiveResult; +use std::fs::File; +use std::io::Read; +use std::io::{Seek, Write}; + +pub struct Reader { + reader: R, +} + +impl ArchiveRead for Reader { + type Reader = R; + type FileInfo = FileInfo; + type FileReader = FileReader; + + fn new(reader: Self::Reader) -> ArchiveResult { + Ok(Self { reader }) + } + + fn files(&self) -> ArchiveResult> { + Ok(Vec::new()) + } + + fn file_reader(&self, name: &str) -> ArchiveResult { + Ok(Self::FileReader {}) + } +} + +impl Reader {} + +pub struct Writer { + writer: W, +} + +impl ArchiveWrite for Writer { + type Writer = W; + type FileInfo = FileInfo; + type FileWriter = FileWriter; + + fn new(writer: Self::Writer) -> ArchiveResult { + Ok(Self { writer }) + } + + fn file_writer(&self, name: &str) -> ArchiveResult { + Ok(Self::FileWriter {}) + } +} + +impl Writer {} 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 @@ +mod archive; +mod file; +mod io; + +pub use io::{Reader, Writer}; -- cgit v1.2.3