Skip to main content

rars_format/
features.rs

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}