#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub enum TopOutputMode {
#[default]
Tui,
Once,
Json,
}
#[derive(Debug, Clone)]
pub struct TopConfig {
pub metrics_url: String,
pub interval_secs: u64,
pub output_mode: TopOutputMode,
pub filter: Option<String>,
}
impl Default for TopConfig {
fn default() -> Self {
Self {
metrics_url: "http://127.0.0.1:9090/metrics".to_string(),
interval_secs: 2,
output_mode: TopOutputMode::default(),
filter: None,
}
}
}
impl TopConfig {
#[must_use]
pub fn from_args(args: &crate::cli::TopArgs) -> Self {
let output_mode = if args.json {
TopOutputMode::Json
} else if args.once {
TopOutputMode::Once
} else {
TopOutputMode::Tui
};
Self {
metrics_url: args.metrics_url.clone(),
interval_secs: args.interval,
output_mode,
filter: args.filter.clone(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_defaults() {
let config = TopConfig::default();
assert_eq!(config.metrics_url, "http://127.0.0.1:9090/metrics");
assert_eq!(config.interval_secs, 2);
assert_eq!(config.output_mode, TopOutputMode::Tui);
assert!(config.filter.is_none());
}
#[test]
fn test_output_mode_json_implies_once() {
assert_ne!(TopOutputMode::Json, TopOutputMode::Once);
assert_ne!(TopOutputMode::Json, TopOutputMode::Tui);
}
}