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}