use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq, Eq)]
pub struct DebugConfig {
#[serde(default)]
pub log_requests: bool,
#[serde(default)]
pub log_responses: bool,
#[serde(default)]
pub log_gates: bool,
#[serde(default)]
pub log_turns: bool,
#[serde(default)]
pub all: bool,
}
impl DebugConfig {
pub fn all() -> Self {
Self {
log_requests: false,
log_responses: false,
log_gates: false,
log_turns: false,
all: true,
}
}
pub fn is_active(&self) -> bool {
self.all || self.log_requests || self.log_responses || self.log_gates || self.log_turns
}
pub fn should_log_requests(&self) -> bool {
self.log_requests || self.all
}
pub fn should_log_responses(&self) -> bool {
self.log_responses || self.all
}
pub fn should_log_gates(&self) -> bool {
self.log_gates || self.all
}
pub fn should_log_turns(&self) -> bool {
self.log_turns || self.all
}
pub fn from_channel_list(spec: &str) -> Self {
let mut cfg = Self::default();
let trimmed = spec.trim();
if trimmed.is_empty() || trimmed.eq_ignore_ascii_case("all") {
cfg.all = true;
return cfg;
}
for raw in trimmed.split(',') {
let token = raw.trim().to_ascii_lowercase();
match token.as_str() {
"" => {}
"all" => cfg.all = true,
"requests" | "request" | "req" => cfg.log_requests = true,
"responses" | "response" | "resp" | "raw" => cfg.log_responses = true,
"gates" | "gate" => cfg.log_gates = true,
"turns" | "turn" => cfg.log_turns = true,
other => {
eprintln!(
"Config warning: unknown --debug channel '{}' (expected: requests, responses, gates, turns, all)",
other
);
}
}
}
cfg
}
pub fn apply_env_overrides(&mut self) {
let truthy = |name: &str| {
std::env::var(name)
.map(|v| {
let v = v.trim().to_ascii_lowercase();
!v.is_empty() && v != "0" && v != "false" && v != "no" && v != "off"
})
.unwrap_or(false)
};
if truthy("SELFWARE_DEBUG") {
self.all = true;
}
if truthy("SELFWARE_DEBUG_REQUEST") {
self.log_requests = true;
}
if truthy("SELFWARE_DEBUG_RAW") {
self.log_responses = true;
}
if truthy("SELFWARE_DEBUG_GATE") {
self.log_gates = true;
}
if truthy("SELFWARE_DEBUG_TURNS") {
self.log_turns = true;
}
}
pub fn merge_cli(&mut self, cli: &DebugConfig) {
if cli.all {
self.all = true;
}
if cli.log_requests {
self.log_requests = true;
}
if cli.log_responses {
self.log_responses = true;
}
if cli.log_gates {
self.log_gates = true;
}
if cli.log_turns {
self.log_turns = true;
}
}
}
#[cfg(test)]
#[path = "../../tests/unit/config/debug/debug_test.rs"]
mod tests;