tyfers/
lib.rs

1// MIT License
2//
3// Copyright (c) 2021 Ferhat Geçdoğan All Rights Reserved.
4// Distributed under the terms of the MIT License.
5//
6//
7
8pub 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}