Regulate verbosity with args

This commit is contained in:
Demmie 2023-04-26 01:41:38 -04:00
parent a841b69e47
commit add5b4644e
No known key found for this signature in database
GPG Key ID: B06DAA3D432C6E9A
3 changed files with 28 additions and 19 deletions

View File

@ -2,11 +2,11 @@ mod defaults;
mod file_config; mod file_config;
mod filters; mod filters;
use clap::{arg, value_parser, ArgAction, Command};
use file_config::FileConfig;
use std::{path::PathBuf, time::Duration};
use self::filters::{Filter, Replacement}; use self::filters::{Filter, Replacement};
use clap::{arg, value_parser, Arg, ArgAction, Command};
use file_config::FileConfig;
use log::LevelFilter;
use std::{path::PathBuf, time::Duration};
pub struct Config { pub struct Config {
pub port: u32, pub port: u32,
@ -17,13 +17,14 @@ pub struct Config {
pub idle_bucket_name: String, pub idle_bucket_name: String,
pub active_window_bucket_name: String, pub active_window_bucket_name: String,
pub no_server: bool, pub no_server: bool,
pub verbosity: LevelFilter,
filters: Vec<Filter>, filters: Vec<Filter>,
} }
impl Config { impl Config {
pub fn from_cli() -> anyhow::Result<Self> { pub fn from_cli() -> anyhow::Result<Self> {
let matches = Command::new("Activity Watcher") let matches = Command::new("Activity Watcher")
.version("0.1.0") .version("0.0.1")
.about("A set of ActivityWatch desktop watchers") .about("A set of ActivityWatch desktop watchers")
.args([ .args([
arg!(-c --config <FILE> "Custom config file").value_parser(value_parser!(PathBuf)), arg!(-c --config <FILE> "Custom config file").value_parser(value_parser!(PathBuf)),
@ -45,6 +46,10 @@ impl Config {
arg!(--"no-server" "Don't communicate to the ActivityWatch server") arg!(--"no-server" "Don't communicate to the ActivityWatch server")
.value_parser(value_parser!(bool)) .value_parser(value_parser!(bool))
.action(ArgAction::SetTrue), .action(ArgAction::SetTrue),
Arg::new("verbosity")
.short('v')
.help("Verbosity level: -v for warnings, -vv for info, -vvv for debug, -vvvv for trace")
.action(ArgAction::Count),
]) ])
.get_matches(); .get_matches();
@ -53,6 +58,13 @@ impl Config {
let hostname = gethostname::gethostname().into_string().unwrap(); let hostname = gethostname::gethostname().into_string().unwrap();
let idle_bucket_name = format!("aw-watcher-afk_{hostname}"); let idle_bucket_name = format!("aw-watcher-afk_{hostname}");
let active_window_bucket_name = format!("aw-watcher-window_{hostname}"); let active_window_bucket_name = format!("aw-watcher-window_{hostname}");
let verbosity = match matches.get_count("verbosity") {
0 => LevelFilter::Error,
1 => LevelFilter::Warn,
2 => LevelFilter::Info,
3 => LevelFilter::Debug,
_ => LevelFilter::Trace,
};
Ok(Self { Ok(Self {
port: config.server.port, port: config.server.port,
@ -64,6 +76,7 @@ impl Config {
active_window_bucket_name, active_window_bucket_name,
filters: config.client.filters, filters: config.client.filters,
no_server: *matches.get_one("no-server").unwrap(), no_server: *matches.get_one("no-server").unwrap(),
verbosity,
}) })
} }

View File

@ -9,15 +9,12 @@ mod watchers;
use config::Config; use config::Config;
use fern::colors::{Color, ColoredLevelConfig}; use fern::colors::{Color, ColoredLevelConfig};
use log::LevelFilter;
use report_client::ReportClient; use report_client::ReportClient;
use std::env;
use std::{sync::Arc, thread}; use std::{sync::Arc, thread};
use watchers::ConstructorFilter;
use crate::watchers::ConstructorFilter; fn setup_logger(verbosity: LevelFilter) -> Result<(), fern::InitError> {
fn setup_logger() -> Result<(), fern::InitError> {
let log_setting = env::var("AWATCHER_LOG").unwrap_or("info".to_string());
fern::Dispatch::new() fern::Dispatch::new()
.format(|out, message, record| { .format(|out, message, record| {
let colors = ColoredLevelConfig::new() let colors = ColoredLevelConfig::new()
@ -32,20 +29,18 @@ fn setup_logger() -> Result<(), fern::InitError> {
message message
)); ));
}) })
.level(log::LevelFilter::Warn) .level(log::LevelFilter::Error)
.level_for( .level_for("awatcher", verbosity)
"awatcher",
log_setting.parse().unwrap_or(log::LevelFilter::Info),
)
.chain(std::io::stdout()) .chain(std::io::stdout())
.apply()?; .apply()?;
Ok(()) Ok(())
} }
fn main() -> anyhow::Result<()> { fn main() -> anyhow::Result<()> {
setup_logger()?; let config = Config::from_cli()?;
setup_logger(config.verbosity)?;
let client = ReportClient::new(Config::from_cli()?)?; let client = ReportClient::new(config)?;
let client = Arc::new(client); let client = Arc::new(client);
if client.config.no_server { if client.config.no_server {

View File

@ -57,7 +57,8 @@ pub const IDLE: &WatcherConstructors = &[
pub const ACTIVE_WINDOW: &WatcherConstructors = &[ pub const ACTIVE_WINDOW: &WatcherConstructors = &[
watcher!(wl_foreign_toplevel::WindowWatcher), watcher!(wl_foreign_toplevel::WindowWatcher),
watcher!(x11_window::WindowWatcher), // XWayland gives _NET_WM_NAME on some windows in KDE, but not on others
watcher!(kwin_window::WindowWatcher), watcher!(kwin_window::WindowWatcher),
watcher!(x11_window::WindowWatcher),
watcher!(gnome_window::WindowWatcher), watcher!(gnome_window::WindowWatcher),
]; ];