monitor-input 1.2.8

A command line tool to change input sources of display monitors with DDC/CI.
Documentation
#![cfg_attr(feature = "winapp", windows_subsystem = "windows")]

use std::fmt;

use clap::Parser;
use toast_logger_win::{Notification, ToastLogger};

use monitor_input::{Cli, Monitor};

fn main() -> anyhow::Result<()> {
    let mut cli: Cli = Cli::parse();
    init_logger(cli.verbose);
    cli.monitors = Monitor::enumerate();
    cli.run()?;
    ToastLogger::flush()?;
    Ok(())
}

fn init_logger(verbose: u8) {
    ToastLogger::builder()
        .auto_flush(false)
        .max_level(match verbose {
            0 => log::LevelFilter::Error,
            1 => log::LevelFilter::Info,
            2 => log::LevelFilter::Debug,
            _ => log::LevelFilter::Trace,
        })
        .format(
            |buf: &mut dyn fmt::Write, record: &log::Record| match record.level() {
                log::Level::Info => write!(buf, "{}", record.args()),
                _ => write!(buf, "{}: {}", record.level(), record.args()),
            },
        )
        .create_notification(|records| {
            let mut notification = Notification::new_with_records(records)?;
            let min_level = records.iter().map(|r| r.level).min().unwrap();
            if min_level >= log::Level::Info {
                notification.expires_in(std::time::Duration::from_secs(10))?;
            }
            Ok(notification)
        })
        .init()
        .unwrap();
}