use std::{ops::Range, path::PathBuf, str::FromStr};
use clap::{Parser, Subcommand};
use crate::{fan::Thresholds, probe::Temp};
pub(crate) type Percentage = u8;
#[derive(Clone, Debug)]
pub(crate) struct PwmSettings {
pub filepath: PathBuf,
pub thresholds: Thresholds,
}
impl FromStr for PwmSettings {
type Err = &'static str;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let mut tokens = s.rsplitn(3, ':');
let stop = tokens
.next()
.ok_or("Missing stop value")?
.parse()
.map_err(|_| "Invalid stop value")?;
let start = tokens
.next()
.ok_or("Missing start value")?
.parse()
.map_err(|_| "Invalid start value")?;
let filepath = tokens.next().ok_or("Missing filepath")?.into();
Ok(Self {
filepath,
thresholds: Thresholds {
min_start: start,
max_stop: stop,
},
})
}
}
#[derive(Clone, Debug)]
pub(crate) struct HwmonSettings {
pub filepath: PathBuf,
pub temp: Option<Range<Temp>>,
}
impl FromStr for HwmonSettings {
type Err = &'static str;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let mut tokens = s.splitn(3, ':');
let filepath = tokens.next().ok_or("Missing filepath")?.into();
let start = tokens
.next()
.map(str::parse)
.transpose()
.map_err(|_| "Invalid min speed temp value")?;
let end = tokens
.next()
.map(str::parse)
.transpose()
.map_err(|_| "Invalid max speed temp value")?;
Ok(Self {
filepath,
temp: if let (Some(start), Some(end)) = (start, end) {
Some(Range { start, end })
} else {
None
},
})
}
}
fn percentage(s: &str) -> Result<u8, String> {
clap_num::number_range(s, 0, 100)
}
#[derive(Parser, Debug)]
#[command(version, about)]
pub(crate) struct Args {
#[arg(short, default_value_t = log::Level::Info)]
pub verbosity: log::Level,
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand, Debug)]
pub(crate) enum Command {
Daemon {
#[arg(short, long, num_args = 1.., required = true)]
drives: Vec<PathBuf>,
#[arg(short, long, num_args = 1.., required = true)]
pwm: Vec<PwmSettings>,
#[arg(short = 't', long, value_name = "TEMP", num_args = 2, default_values_t = vec![30.0, 50.0])]
drive_temp_range: Vec<Temp>,
#[arg(short, long, default_value_t = 20, value_parser=percentage)]
min_fan_speed_prct: Percentage,
#[arg(short, long)]
interval: humantime::Duration,
#[arg(short = 'w', long)]
hwmons: Vec<HwmonSettings>,
#[arg(long, default_value_t = 7634)]
hddtemp_daemon_port: u16,
#[arg(short, long)]
restore_fan_settings: bool,
},
PwmTest {
#[arg(short, long, num_args = 1.., required = true)]
pwm: Vec<PathBuf>,
},
}