Skip to main content

cfgd_core/config/
compliance.rs

1use serde::{Deserialize, Serialize};
2
3use super::source::default_true;
4
5// ---------------------------------------------------------------------------
6// Compliance configuration
7// ---------------------------------------------------------------------------
8
9#[derive(Debug, Clone, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase", deny_unknown_fields)]
11pub struct ComplianceConfig {
12    #[serde(default)]
13    pub enabled: bool,
14    #[serde(default = "default_compliance_interval")]
15    pub interval: String,
16    #[serde(default = "default_compliance_retention")]
17    pub retention: String,
18    #[serde(default)]
19    pub scope: ComplianceScope,
20    #[serde(default)]
21    pub export: ComplianceExport,
22}
23
24fn default_compliance_interval() -> String {
25    "1h".into()
26}
27fn default_compliance_retention() -> String {
28    "30d".into()
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
32#[serde(rename_all = "camelCase", deny_unknown_fields)]
33pub struct ComplianceScope {
34    #[serde(default = "default_true")]
35    pub files: bool,
36    #[serde(default = "default_true")]
37    pub packages: bool,
38    #[serde(default = "default_true")]
39    pub system: bool,
40    #[serde(default = "default_true")]
41    pub secrets: bool,
42    #[serde(default)]
43    pub watch_paths: Vec<String>,
44    #[serde(default)]
45    pub watch_package_managers: Vec<String>,
46}
47
48impl Default for ComplianceScope {
49    fn default() -> Self {
50        Self {
51            files: true,
52            packages: true,
53            system: true,
54            secrets: true,
55            watch_paths: Vec::new(),
56            watch_package_managers: Vec::new(),
57        }
58    }
59}
60
61#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
62pub enum ComplianceFormat {
63    #[default]
64    Json,
65    Yaml,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
69#[serde(rename_all = "camelCase", deny_unknown_fields)]
70pub struct ComplianceExport {
71    #[serde(default)]
72    pub format: ComplianceFormat,
73    #[serde(default = "default_compliance_path")]
74    pub path: String,
75}
76
77fn default_compliance_path() -> String {
78    "~/.local/share/cfgd/compliance/".into()
79}
80
81impl Default for ComplianceExport {
82    fn default() -> Self {
83        Self {
84            format: ComplianceFormat::default(),
85            path: default_compliance_path(),
86        }
87    }
88}