Skip to main content

rust_supervisor/config/
audit.rs

1//! Command audit configuration model.
2//!
3//! This module owns the single public audit configuration used by the
4//! supervisor root configuration and by IPC security audit persistence.
5
6use confique::Config;
7use schemars::JsonSchema;
8use serde::{Deserialize, Serialize};
9
10/// Audit persistence configuration.
11#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Config, JsonSchema)]
12pub struct AuditConfig {
13    /// Whether audit logging is enabled. Default: true.
14    #[config(default = true)]
15    #[serde(default = "default_true")]
16    pub enabled: bool,
17
18    /// Audit storage backend. Default: "memory".
19    /// - "memory": ring buffer only, not persisted.
20    /// - "file": append-only JSON lines file.
21    #[config(default = "memory")]
22    #[serde(default = "default_audit_backend")]
23    pub backend: String,
24
25    /// File path for file backend. Required when backend is "file".
26    #[config(default = "/tmp/rust-supervisor-demo/audit.jsonl")]
27    #[schemars(!default)]
28    #[serde(default = "default_file_path")]
29    pub file_path: String,
30
31    /// Failure strategy when audit backend is unavailable.
32    /// - "fail_closed": reject write commands when audit cannot be written.
33    /// - "defer_bounded": defer audit writes with bounded queue.
34    ///   Default: "fail_closed".
35    #[config(default = "fail_closed")]
36    #[serde(default = "default_fail_closed")]
37    pub failure_strategy: String,
38
39    /// Max queue size for "defer_bounded" strategy. Default: 1000.
40    #[config(default = 1000)]
41    #[serde(default = "default_1000")]
42    pub max_defer_queue: usize,
43}
44
45impl Default for AuditConfig {
46    /// Returns default audit config: memory backend, fail_closed strategy.
47    fn default() -> Self {
48        Self {
49            enabled: true,
50            backend: "memory".into(),
51            file_path: "/tmp/rust-supervisor-demo/audit.jsonl".to_string(),
52            failure_strategy: "fail_closed".into(),
53            max_defer_queue: 1000,
54        }
55    }
56}
57
58/// Serde default helper: returns true.
59fn default_true() -> bool {
60    true
61}
62
63/// Serde default helper: returns "memory".
64fn default_audit_backend() -> String {
65    "memory".into()
66}
67
68/// Serde default helper: returns the demo audit file path.
69fn default_file_path() -> String {
70    "/tmp/rust-supervisor-demo/audit.jsonl".to_string()
71}
72
73/// Serde default helper: returns "fail_closed".
74fn default_fail_closed() -> String {
75    "fail_closed".into()
76}
77
78/// Serde default helper: returns 1000.
79fn default_1000() -> usize {
80    1000
81}