use clap::{
CommandFactory, Parser, ValueHint,
builder::{PossibleValuesParser, TypedValueParser},
};
use log::LevelFilter;
use mecomp_core::logger::init_logger;
use mecomp_mpris::{Mpris, Subscriber};
#[derive(Debug, Parser)]
#[command(name = "mecomp-mpris", version = env!("CARGO_PKG_VERSION"), about)]
struct Flags {
#[clap(
long,
default_value = "6600",
value_hint = ValueHint::Other,
)]
port: u16,
#[clap(
long,
default_value = "info",
value_parser = PossibleValuesParser::new([ "off", "trace", "debug", "info", "warn", "error"])
.map(|s| s.parse::<LevelFilter>().unwrap())
)]
log_level: LevelFilter,
}
#[tokio::main()]
async fn main() {
clap_complete::CompleteEnv::with_factory(Flags::command).complete();
let flags = Flags::parse();
init_logger(flags.log_level, None);
let Ok(daemon) = mecomp_prost::init_client_with_retry::<5, 1>(flags.port)
.await
.inspect_err(|e| log::error!("{e}"))
else {
return;
};
log::info!("Connected to daemon");
let mpris = Mpris::new_with_daemon(daemon);
let bus_name_suffix = format!("mecomp.mpris.port{}.pid{}", mpris.port, std::process::id());
let server = match mpris.start_server(&bus_name_suffix).await {
Ok(server) => server,
Err(e) => {
log::error!("Failed to start Mpris server: {e}");
return;
}
};
if let Err(e) = Subscriber.main_loop(&server).await {
log::error!("Failed to start subscriber: {e}");
return;
}
}