use std::time::Duration;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Component {
Cpu,
Gpu,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub enum Target {
#[default]
System,
Pid(u32),
App(String),
}
impl Target {
#[must_use]
pub fn app(name: impl Into<String>) -> Self {
Self::App(name.into())
}
#[must_use]
pub fn pid(pid: u32) -> Self {
Self::Pid(pid)
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum ElevationPolicy {
#[default]
Never,
SudoNonInteractive,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum AppMatch {
#[default]
Exact,
Contains,
}
#[derive(Clone, Debug)]
pub struct MonitorConfig {
pub target: Target,
pub component: Option<Component>,
pub app_match: AppMatch,
pub app_refresh_interval: Duration,
pub cpu_idle_baseline: Option<f64>,
pub elevation: ElevationPolicy,
}
pub const DEFAULT_APP_REFRESH_INTERVAL: Duration = Duration::from_secs(3);
impl Default for MonitorConfig {
fn default() -> Self {
Self {
target: Target::default(),
component: None,
app_match: AppMatch::default(),
app_refresh_interval: DEFAULT_APP_REFRESH_INTERVAL,
cpu_idle_baseline: None,
elevation: ElevationPolicy::default(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_defaults_measure_the_whole_system_without_elevating() {
let config = MonitorConfig::default();
assert_eq!(config.target, Target::System);
assert_eq!(config.component, None);
assert_eq!(config.app_match, AppMatch::Exact);
assert_eq!(config.app_refresh_interval, DEFAULT_APP_REFRESH_INTERVAL);
assert_eq!(config.cpu_idle_baseline, None);
assert_eq!(config.elevation, ElevationPolicy::Never);
}
#[test]
fn target_helpers_create_expected_variants() {
assert_eq!(Target::app("firefox"), Target::App("firefox".into()));
assert_eq!(Target::pid(1234), Target::Pid(1234));
}
}