use std::time::Duration;
use crate::safety::SafetyConfig;
#[derive(Debug, Clone)]
pub struct ModuleConfig {
pub enabled: bool,
pub timeout: Option<Duration>,
pub options: std::collections::HashMap<String, String>,
}
impl Default for ModuleConfig {
fn default() -> Self {
Self {
enabled: true,
timeout: Some(Duration::from_secs(30)),
options: std::collections::HashMap::new(),
}
}
}
impl ModuleConfig {
pub fn new() -> Self {
Self::default()
}
pub fn disabled() -> Self {
Self {
enabled: false,
..Self::default()
}
}
pub fn with_enabled(mut self, enabled: bool) -> Self {
self.enabled = enabled;
self
}
pub fn with_timeout(mut self, timeout: Duration) -> Self {
self.timeout = Some(timeout);
self
}
pub fn no_timeout(mut self) -> Self {
self.timeout = None;
self
}
pub fn with_option(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.options.insert(key.into(), value.into());
self
}
}
#[derive(Debug, Clone)]
pub struct StdlibConfig {
pub safety: SafetyConfig,
pub process: ModuleConfig,
pub fs: ModuleConfig,
pub path: ModuleConfig,
pub env: ModuleConfig,
pub format: ModuleConfig,
pub net: ModuleConfig,
pub time: ModuleConfig,
pub metrics: ModuleConfig,
}
impl Default for StdlibConfig {
fn default() -> Self {
Self {
safety: SafetyConfig::default(),
process: ModuleConfig::disabled(), fs: ModuleConfig::default(),
path: ModuleConfig::default(),
env: ModuleConfig::default(),
format: ModuleConfig::default(),
net: ModuleConfig::disabled(), time: ModuleConfig::default(),
metrics: ModuleConfig::default(),
}
}
}
impl StdlibConfig {
pub fn new() -> Self {
Self::default()
}
pub fn permissive() -> Self {
Self {
safety: SafetyConfig::permissive(),
process: ModuleConfig::default(),
fs: ModuleConfig::default(),
path: ModuleConfig::default(),
env: ModuleConfig::default(),
format: ModuleConfig::default(),
net: ModuleConfig::default(),
time: ModuleConfig::default(),
metrics: ModuleConfig::default(),
}
}
pub fn strict() -> Self {
Self {
safety: SafetyConfig::strict(),
process: ModuleConfig::disabled(),
fs: ModuleConfig::disabled(),
path: ModuleConfig::default(),
env: ModuleConfig::disabled(),
format: ModuleConfig::default(),
net: ModuleConfig::disabled(),
time: ModuleConfig::default(),
metrics: ModuleConfig::disabled(),
}
}
pub fn with_safety(mut self, safety: SafetyConfig) -> Self {
self.safety = safety;
self
}
pub fn with_process(mut self, config: ModuleConfig) -> Self {
self.process = config;
self
}
pub fn with_fs(mut self, config: ModuleConfig) -> Self {
self.fs = config;
self
}
pub fn with_path(mut self, config: ModuleConfig) -> Self {
self.path = config;
self
}
pub fn with_env(mut self, config: ModuleConfig) -> Self {
self.env = config;
self
}
pub fn with_format(mut self, config: ModuleConfig) -> Self {
self.format = config;
self
}
pub fn with_net(mut self, config: ModuleConfig) -> Self {
self.net = config;
self
}
pub fn with_time(mut self, config: ModuleConfig) -> Self {
self.time = config;
self
}
pub fn with_metrics(mut self, config: ModuleConfig) -> Self {
self.metrics = config;
self
}
pub fn enable_all(mut self) -> Self {
self.process.enabled = true;
self.fs.enabled = true;
self.path.enabled = true;
self.env.enabled = true;
self.format.enabled = true;
self.net.enabled = true;
self.time.enabled = true;
self.metrics.enabled = true;
self
}
pub fn disable_all(mut self) -> Self {
self.process.enabled = false;
self.fs.enabled = false;
self.path.enabled = false;
self.env.enabled = false;
self.format.enabled = false;
self.net.enabled = false;
self.time.enabled = false;
self.metrics.enabled = false;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_module_config() {
let config = ModuleConfig::new()
.with_timeout(Duration::from_secs(10))
.with_option("key", "value");
assert!(config.enabled);
assert_eq!(config.timeout, Some(Duration::from_secs(10)));
assert_eq!(config.options.get("key"), Some(&"value".to_string()));
}
#[test]
fn test_stdlib_config_defaults() {
let config = StdlibConfig::default();
assert!(!config.process.enabled);
assert!(!config.net.enabled);
assert!(config.fs.enabled);
assert!(config.time.enabled);
}
#[test]
fn test_stdlib_config_permissive() {
let config = StdlibConfig::permissive();
assert!(config.process.enabled);
assert!(config.net.enabled);
assert!(config.fs.enabled);
}
#[test]
fn test_stdlib_config_strict() {
let config = StdlibConfig::strict();
assert!(!config.process.enabled);
assert!(!config.net.enabled);
assert!(!config.fs.enabled);
assert!(!config.env.enabled);
}
}