aboutsummaryrefslogtreecommitdiff
path: root/src/zip/file.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/zip/file.rs')
-rw-r--r--src/zip/file.rs100
1 files changed, 90 insertions, 10 deletions
diff --git a/src/zip/file.rs b/src/zip/file.rs
index dba8d06..261390f 100644
--- a/src/zip/file.rs
+++ b/src/zip/file.rs
@@ -1,44 +1,124 @@
1use crate::file::{ArchiveFile, ArchiveFileRead, ArchiveFileWrite}; 1use crate::file::{ArchiveFile, ArchiveFileRead, ArchiveFileWrite};
2use crate::result::{ArchiveError, ArchiveResult};
3use chrono::NaiveDateTime;
2use std::io::{Read, Write}; 4use std::io::{Read, Write};
3 5
4pub struct FileInfo {} 6pub struct GeneralPurposeBitFlag {}
5 7
6pub struct FileReader {} 8pub enum CompressionMethod {
9 Store,
10 Deflate,
11 Bzip2,
12 LZMA,
13 Zstandard,
14}
15
16impl TryFrom<u16> for CompressionMethod {
17 type Error = ArchiveError;
18
19 fn try_from(value: u16) -> ArchiveResult<Self> {
20 Ok(match value {
21 0 => Self::Store,
22 8 => Self::Deflate,
23 12 => Self::Bzip2,
24 14 => Self::LZMA,
25 93 | 20 => Self::Zstandard,
26 _ => return Err(ArchiveError::UnsupportedCompressionMethod { method: value }),
27 })
28 }
29}
7 30
8pub struct FileWriter {} 31pub struct FileInfo {
32 number: u64,
33 version_made_by: u16,
34 version_needed: u16,
35 general_purpose_bit_flag: GeneralPurposeBitFlag,
36 compression_method: CompressionMethod,
37 file_modified_at: NaiveDateTime,
38 crc32: u32,
39 compressed_size: u64,
40 uncompressed_size: u64,
41 name: String,
42 comment: String,
43 header_offset: u64,
44}
45
46impl FileInfo {
47 pub fn new(
48 number: u64,
49 version_made_by: u16,
50 version_needed: u16,
51 general_purpose_bit_flag: GeneralPurposeBitFlag,
52 compression_method: CompressionMethod,
53 file_modified_at: NaiveDateTime,
54 crc32: u32,
55 compressed_size: u64,
56 uncompressed_size: u64,
57 name: String,
58 comment: String,
59 header_offset: u64,
60 ) -> Self {
61 Self {
62 number,
63 version_made_by,
64 version_needed,
65 general_purpose_bit_flag,
66 compression_method,
67 file_modified_at,
68 crc32,
69 compressed_size,
70 uncompressed_size,
71 name,
72 comment,
73 header_offset,
74 }
75 }
76}
77
78pub struct FileReader {
79 info: FileInfo,
80}
9 81
10impl ArchiveFile for FileReader { 82impl ArchiveFile for FileReader {
11 type Info = FileInfo; 83 type Info = FileInfo;
12 84
13 fn info() -> Self::Info { 85 fn new(info: Self::Info) -> Self {
14 Self::Info {} 86 Self { info }
15 } 87 }
16} 88}
17 89
18impl Read for FileReader { 90impl Read for FileReader {
19 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> { 91 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
20 return Ok(0); 92 todo!()
21 } 93 }
22} 94}
23 95
24impl ArchiveFileRead for FileReader {} 96impl ArchiveFileRead for FileReader {}
25 97
98impl FileReader {}
99
100pub struct FileWriter {
101 info: FileInfo,
102}
103
26impl ArchiveFile for FileWriter { 104impl ArchiveFile for FileWriter {
27 type Info = FileInfo; 105 type Info = FileInfo;
28 106
29 fn info() -> Self::Info { 107 fn new(info: Self::Info) -> Self {
30 Self::Info {} 108 Self { info }
31 } 109 }
32} 110}
33 111
34impl Write for FileWriter { 112impl Write for FileWriter {
35 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> { 113 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
36 return Ok(0); 114 todo!()
37 } 115 }
38 116
39 fn flush(&mut self) -> std::io::Result<()> { 117 fn flush(&mut self) -> std::io::Result<()> {
40 Ok(()) 118 todo!()
41 } 119 }
42} 120}
43 121
44impl ArchiveFileWrite for FileWriter {} 122impl ArchiveFileWrite for FileWriter {}
123
124impl FileWriter {}