paxit/algorithms/
mod.rs

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}