1pub enum Tyfes {
9 Nothing,
10 FPaper,
11 Jpeg,
12 Png,
13 Gif,
14 Bmp,
15 WebP,
16 Pdf,
17 Ico
18}
19
20pub enum Markers {
21 FPaperStart,
22 FPaperStart2,
23 FPaperStart3,
24 FPaperStart4,
25 FPaperStart5,
26 FPaperStart6,
27
28 JpegSoi,
29 JpegStart,
30
31 PngSoi,
32 PngStart2,
33 PngStart3,
34 PngStart4,
35
36 GifSoi,
37 GifStart2,
38 GifStart3,
39
40 BmpSoi,
41 BmpStart2,
42
43 WebpSoi,
44 WebpStart2,
45 WebpStart3,
46 WebpStart4,
47
48 PdfSoi,
49 PdfStart2,
50 PdfStart3,
51 PdfStart4,
52
53 IcoSoi,
54 IcoStart3
55}
56
57pub struct Tyfe {
58 extension: String,
59 filename: String,
60 binary_ext: Vec<String>,
61}
62
63impl Markers {
64 fn val(&self) -> u8 {
65 match *self {
66 Markers::FPaperStart => 0x02,
67 Markers::FPaperStart2
68 | Markers::GifStart3
69 | Markers::PdfStart4 => 0x46,
70 Markers::FPaperStart3
71 | Markers::PngStart2
72 | Markers::WebpStart4
73 | Markers::PdfStart2 => 0x50,
74 Markers::FPaperStart4 => 0x61,
75 Markers::FPaperStart5 => 0x67,
76 Markers::FPaperStart6 => 0x65,
77
78 Markers::JpegSoi => 0xD8,
79 Markers::JpegStart => 0xFF,
80
81 Markers::PngSoi => 0x89,
82 Markers::PngStart3 => 0x4E,
83 Markers::PngStart4 | Markers::GifSoi => 0x47,
84
85 Markers::GifStart2 => 0x49,
86
87 Markers::BmpSoi | Markers::WebpStart3 => 0x42,
88 Markers::BmpStart2 => 0x4D,
89
90 Markers::WebpSoi => 0x57,
91 Markers::WebpStart2 => 0x45,
92
93 Markers::PdfSoi => 0x25,
94 Markers::PdfStart3 => 0x44,
95
96 Markers::IcoSoi => 0x00,
97 Markers::IcoStart3 => 0x01,
98
99 _ => {
100 0x00
101 }
102 }
103 }
104}
105
106impl Default for Tyfe {
107 fn default() -> Self {
108 Tyfe {
109 extension : "".to_string(),
110 filename : "".to_string(),
111 binary_ext: vec![
112 ".fpaper",
113 ".jpg",
114 ".jpeg",
115 ".png",
116 ".gif",
117 ".bmp",
118 ".webp",
119 ".pdf",
120 ".ico"
121 ].iter().map(|val| val.to_string()).collect(),
122 }
123 }
124}
125
126impl Tyfe {
127 fn check(&mut self, file: String) -> Tyfes {
128 self.filename = file;
129 self.extension = std::path::Path::new(&self.filename)
130 .extension()
131 .and_then(std::ffi::OsStr::to_str).unwrap().to_string();
132
133 return match &*self.extension.trim() {
134 "fpaper" |
135 "jpg" |
136 "jpeg" |
137 "png" |
138 "gif" |
139 "bmp" |
140 "webp" |
141 "pdf" |
142 "ico" => {
143 self.what_is_this()
144 },
145 _ => { Tyfes::Nothing }
146 }
147 }
148
149 fn what_is_this(&self) -> Tyfes {
150 let data = std::fs::read(&self.filename).unwrap();
151
152 if *data.get(0).unwrap() == Markers::FPaperStart.val()
153 && *data.get(1).unwrap() == Markers::FPaperStart2.val()
154 && *data.get(2).unwrap() == Markers::FPaperStart3.val()
155 && *data.get(3).unwrap() == Markers::FPaperStart4.val()
156 && *data.get(4).unwrap() == Markers::FPaperStart5.val()
157 && *data.get(5).unwrap() == Markers::FPaperStart6.val() {
158 return Tyfes::FPaper;
159 }
160
161 if *data.get(0).unwrap() == Markers::JpegStart.val()
162 && *data.get(1).unwrap() == Markers::JpegSoi.val()
163 && *data.get(2).unwrap() == Markers::JpegStart.val() {
164 return Tyfes::Jpeg;
165 }
166
167 if *data.get(0).unwrap() == Markers::PngSoi.val()
168 && *data.get(1).unwrap() == Markers::PngStart2.val()
169 && *data.get(2).unwrap() == Markers::PngStart3.val()
170 && *data.get(3).unwrap() == Markers::PngStart4.val() {
171 return Tyfes::Png;
172 }
173
174 if *data.get(0).unwrap() == Markers::GifSoi.val()
175 && *data.get(1).unwrap() == Markers::GifStart2.val()
176 && *data.get(2).unwrap() == Markers::GifStart3.val() {
177 return Tyfes::Gif;
178 }
179
180 if *data.get(0).unwrap() == Markers::BmpSoi.val()
181 && *data.get(1).unwrap() == Markers::BmpStart2.val() {
182 return Tyfes::Bmp;
183 }
184
185 if *data.get(8).unwrap() == Markers::WebpSoi.val()
186 && *data.get(9).unwrap() == Markers::WebpStart2.val()
187 && *data.get(10).unwrap() == Markers::WebpStart3.val()
188 && *data.get(11).unwrap() == Markers::WebpStart4.val() {
189 return Tyfes::WebP;
190 }
191
192 if *data.get(0).unwrap() == Markers::PdfSoi.val()
193 && *data.get(1).unwrap() == Markers::PdfStart2.val()
194 && *data.get(2).unwrap() == Markers::PdfStart3.val()
195 && *data.get(3).unwrap() == Markers::PdfStart4.val() {
196 return Tyfes::Pdf;
197 }
198
199 if *data.get(0).unwrap() == Markers::IcoSoi.val()
200 && *data.get(1).unwrap() == Markers::IcoSoi.val()
201 && *data.get(2).unwrap() == Markers::IcoStart3.val()
202 && *data.get(3).unwrap() == Markers::IcoSoi.val() {
203 return Tyfes::Ico;
204 }
205
206 Tyfes::Nothing
207 }
208}
209
210
211#[cfg(test)]
212mod tests {
213 use crate::{Tyfe, Tyfes};
214 use std::io::{stdin};
215
216 #[test]
217 fn hmm() {
218 let mut init = Tyfe::default();
219 let file_exts = vec![
220 ".fpaper",
221 ".jpg",
222 ".gif",
223 ".png",
224 ".bmp",
225 ".webp",
226 ".pdf",
227 ".ico"
228 ];
229
230 for ext in file_exts {
231 println!("{}", match init.check(format!("formats/test{}", ext).to_string()) {
232 Tyfes::FPaper => "FPaper",
233 Tyfes::Jpeg => "JPEG",
234 Tyfes::Png => "PNG",
235 Tyfes::Gif => "GIF",
236 Tyfes::Bmp => "BMP",
237 Tyfes::WebP => "WebP",
238 Tyfes::Pdf => "PDF",
239 Tyfes::Ico => "ICO",
240 _ => "Hmm?"
241 });
242 }
243 }
244}