use std::{ env, fs::File, io::{BufRead as _, BufReader}, path::PathBuf, time::Duration, }; use eyre::ContextCompat as _; pub(crate) struct Config { pub(crate) netdev: Option, pub(crate) interval: Duration, } impl Config { const CONFIG_FILE: &'static str = ".config/pfs/linkspeed"; pub(crate) fn from_file() -> eyre::Result { let config_file = PathBuf::from(env::var("HOME")?).join(Self::CONFIG_FILE); let mut config = Self::default(); if let Ok(file) = File::open(&config_file) { let file = BufReader::new(file); for line in file.lines() { let line = line?; match &line { line if line.starts_with("netdev") => { config.netdev = Some(Self::read_config_value(line)?.to_string()); } line if line.starts_with("interval") => { let interval = Self::read_config_value(line)?.parse::()?; config.interval = Duration::from_secs_f64(interval); } _ => {} } } } Ok(config) } fn read_config_value(line: &str) -> eyre::Result<&str> { let val = line .split('=') .nth(1) .wrap_err("failed to parse value".to_string())? .trim(); Ok(val) } } impl Default for Config { fn default() -> Self { Config { netdev: None, interval: Duration::from_secs(1), } } }