1pub mod bmp;
2pub mod dds;
3pub mod farbfeld;
4pub mod gif;
5pub mod gzip;
6pub mod hdr;
7pub mod ico;
8pub mod jpeg;
9pub mod lzma;
10pub mod lz4;
11pub mod png;
12pub mod pnm;
13pub mod sz;
14pub mod tar;
15pub mod tga;
16pub mod tiff;
17pub mod webp;
18pub mod zip;
19pub mod zstd;
20
21use super::pack::Pack;
22use std::path::Path;
23
24pub fn determine_compressor(mode: &str, files: &[&Path]) -> Result<Box<dyn Pack>, String> {
25 let extension = match mode {
26 "c" | "compress" | "p" | "pack" => files[0].extension().and_then(|ext| ext.to_str()),
27 "u" | "uncompress" | "unpack" => files[0].extension().and_then(|ext| ext.to_str()),
28 _ => None,
29 };
30
31 let compressors = vec![
32 Box::new(bmp::Bmp) as Box<dyn Pack>,
33 Box::new(dds::Dds) as Box<dyn Pack>,
34 Box::new(farbfeld::Farbfeld) as Box<dyn Pack>,
35 Box::new(gif::Gif) as Box<dyn Pack>,
36 Box::new(gzip::Gzip) as Box<dyn Pack>,
37 Box::new(hdr::Hdr) as Box<dyn Pack>,
38 Box::new(ico::Ico) as Box<dyn Pack>,
39 Box::new(jpeg::Jpeg) as Box<dyn Pack>,
40 Box::new(lzma::Lzma) as Box<dyn Pack>,
41 Box::new(lz4::Lz4) as Box<dyn Pack>,
42 Box::new(png::Png) as Box<dyn Pack>,
43 Box::new(pnm::Pnm) as Box<dyn Pack>,
44 Box::new(sz::Sz) as Box<dyn Pack>,
45 Box::new(tar::Tar) as Box<dyn Pack>,
46 Box::new(tga::Tga) as Box<dyn Pack>,
47 Box::new(tiff::Tiff) as Box<dyn Pack>,
48 Box::new(webp::Webp) as Box<dyn Pack>,
49 Box::new(zip::Zip) as Box<dyn Pack>,
50 Box::new(zstd::Zstd) as Box<dyn Pack>,
51 ];
52
53 for compressor in compressors {
54 if compressor.extensions().contains(&extension.unwrap_or("")) {
55 return Ok(compressor);
56 }
57 }
58
59 let supported_extensions: Vec<&str> = vec![
60 bmp::Bmp.extensions(),
61 dds::Dds.extensions(),
62 farbfeld::Farbfeld.extensions(),
63 gif::Gif.extensions(),
64 gzip::Gzip.extensions(),
65 hdr::Hdr.extensions(),
66 ico::Ico.extensions(),
67 jpeg::Jpeg.extensions(),
68 lzma::Lzma.extensions(),
69 lz4::Lz4.extensions(),
70 png::Png.extensions(),
71 pnm::Pnm.extensions(),
72 sz::Sz.extensions(),
73 tar::Tar.extensions(),
74 tga::Tga.extensions(),
75 tiff::Tiff.extensions(),
76 webp::Webp.extensions(),
77 zip::Zip.extensions(),
78 zstd::Zstd.extensions(),
79 ]
80 .into_iter()
81 .flatten()
82 .collect();
83
84 Err(format!(
85 "Unsupported file format. Use one of the following extensions: {:?}",
86 supported_extensions
87 ))
88}