1use crate::error::{Error, Result};
2use crate::version::ArchiveVersion;
3
4#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
5#[non_exhaustive]
6pub struct FeatureSet {
7 pub solid: bool,
8 pub file_encryption: bool,
9 pub header_encryption: bool,
10 pub archive_comment: bool,
11 pub file_comment: bool,
12 pub recovery_record: bool,
13 pub rarvm_filters: bool,
14 pub quick_open: bool,
15 pub sfx: bool,
16 pub authenticity_verification: bool,
17}
18
19impl FeatureSet {
20 pub const fn store_only() -> Self {
21 Self {
22 solid: false,
23 file_encryption: false,
24 header_encryption: false,
25 archive_comment: false,
26 file_comment: false,
27 recovery_record: false,
28 rarvm_filters: false,
29 quick_open: false,
30 sfx: false,
31 authenticity_verification: false,
32 }
33 }
34
35 pub fn validate_for(self, version: ArchiveVersion) -> Result<()> {
36 if version.is_rar13_family() {
37 self.reject(version, self.header_encryption, "header_encryption")?;
38 self.reject(version, self.recovery_record, "recovery_record")?;
39 self.reject(version, self.rarvm_filters, "rarvm_filters")?;
40 self.reject(version, self.quick_open, "quick_open")?;
41 }
42
43 Ok(())
44 }
45
46 fn reject(self, version: ArchiveVersion, enabled: bool, feature: &'static str) -> Result<()> {
47 if enabled {
48 Err(Error::UnsupportedFeature { version, feature })
49 } else {
50 Ok(())
51 }
52 }
53}