Skip to main content

rars_format/
version.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2#[non_exhaustive]
3pub enum ArchiveFamily {
4    Rar13,
5    Rar15To40,
6    Rar50Plus,
7}
8
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10#[non_exhaustive]
11pub enum ArchiveVersion {
12    Rar13,
13    Rar14,
14    Rar15,
15    Rar20,
16    Rar29,
17    Rar30,
18    Rar40,
19    Rar50,
20    Rar70,
21}
22
23impl ArchiveVersion {
24    pub const fn family(self) -> ArchiveFamily {
25        match self {
26            Self::Rar13 | Self::Rar14 => ArchiveFamily::Rar13,
27            Self::Rar15 | Self::Rar20 | Self::Rar29 | Self::Rar30 | Self::Rar40 => {
28                ArchiveFamily::Rar15To40
29            }
30            Self::Rar50 | Self::Rar70 => ArchiveFamily::Rar50Plus,
31        }
32    }
33
34    pub const fn is_rar13_family(self) -> bool {
35        matches!(self, Self::Rar13 | Self::Rar14)
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn maps_versions_to_archive_families() {
45        let cases = [
46            (ArchiveVersion::Rar13, ArchiveFamily::Rar13),
47            (ArchiveVersion::Rar14, ArchiveFamily::Rar13),
48            (ArchiveVersion::Rar15, ArchiveFamily::Rar15To40),
49            (ArchiveVersion::Rar20, ArchiveFamily::Rar15To40),
50            (ArchiveVersion::Rar29, ArchiveFamily::Rar15To40),
51            (ArchiveVersion::Rar30, ArchiveFamily::Rar15To40),
52            (ArchiveVersion::Rar40, ArchiveFamily::Rar15To40),
53            (ArchiveVersion::Rar50, ArchiveFamily::Rar50Plus),
54            (ArchiveVersion::Rar70, ArchiveFamily::Rar50Plus),
55        ];
56
57        for (version, family) in cases {
58            assert_eq!(version.family(), family);
59        }
60    }
61
62    #[test]
63    fn identifies_rar13_family_versions() {
64        let cases = [
65            (ArchiveVersion::Rar13, true),
66            (ArchiveVersion::Rar14, true),
67            (ArchiveVersion::Rar15, false),
68            (ArchiveVersion::Rar20, false),
69            (ArchiveVersion::Rar29, false),
70            (ArchiveVersion::Rar30, false),
71            (ArchiveVersion::Rar40, false),
72            (ArchiveVersion::Rar50, false),
73            (ArchiveVersion::Rar70, false),
74        ];
75
76        for (version, expected) in cases {
77            assert_eq!(version.is_rar13_family(), expected);
78        }
79    }
80}