use std::collections::HashMap;
use std::time::Duration;
#[derive(Debug, Clone)]
pub enum ServiceCloudConfig {
InstanceType {
provider: Option<String>,
instance_type: String,
cpu_query: Option<String>,
},
ManualWatts {
idle_watts: f64,
max_watts: f64,
cpu_query: Option<String>,
},
}
#[derive(Clone)]
pub struct CloudEnergyConfig {
pub prometheus_endpoint: String,
pub scrape_interval: Duration,
pub default_provider: Option<String>,
pub default_instance_type: Option<String>,
pub cpu_metric: Option<String>,
pub services: HashMap<String, ServiceCloudConfig>,
pub auth_header: Option<String>,
}
impl std::fmt::Debug for CloudEnergyConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("CloudEnergyConfig")
.field("prometheus_endpoint", &self.prometheus_endpoint)
.field("scrape_interval", &self.scrape_interval)
.field("default_provider", &self.default_provider)
.field("default_instance_type", &self.default_instance_type)
.field("cpu_metric", &self.cpu_metric)
.field("services", &self.services)
.field(
"auth_header",
&self.auth_header.as_ref().map(|_| "[REDACTED]"),
)
.finish()
}
}
impl ServiceCloudConfig {
#[must_use]
pub fn cpu_query(&self) -> Option<&str> {
match self {
Self::InstanceType { cpu_query, .. } | Self::ManualWatts { cpu_query, .. } => {
cpu_query.as_deref()
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
fn sample_config() -> CloudEnergyConfig {
CloudEnergyConfig {
prometheus_endpoint: "http://prometheus:9090".to_string(),
scrape_interval: Duration::from_secs(15),
default_provider: Some("aws".to_string()),
default_instance_type: Some("c5.xlarge".to_string()),
cpu_metric: None,
services: HashMap::new(),
auth_header: Some("Authorization: Bearer super-secret-do-not-log".to_string()),
}
}
#[test]
fn debug_impl_redacts_auth_header() {
let cfg = sample_config();
crate::test_helpers::assert_debug_redacts_secret!(&cfg, "super-secret-do-not-log");
}
#[test]
fn debug_impl_preserves_non_secret_fields() {
let cfg = sample_config();
let dbg = format!("{cfg:?}");
assert!(dbg.contains("prometheus_endpoint"));
assert!(dbg.contains("http://prometheus:9090"));
assert!(dbg.contains("c5.xlarge"));
assert!(dbg.contains("aws"));
}
}