use chrono::Local;
use clap::{Parser, Subcommand};
use std::io::Write;
mod commands;
mod config;
mod ecs;
mod errors;
mod events;
mod manager;
mod platform;
mod reader;
mod util;
#[cfg(test)]
mod tests;
embed_plist::embed_info_plist!("../assets/Info.plist");
use events::{EventHandler, EventSender};
use errors::Result;
use platform::service;
use reader::CommandReader;
#[derive(Clone, Debug, Default, Parser)]
#[command(
version = clap::crate_version!(),
author = clap::crate_authors!(),
about = clap::crate_description!(),
)]
pub struct Paneru {
#[clap(subcommand)]
subcmd: Option<SubCmd>,
}
#[derive(Clone, Debug, Default, Subcommand)]
pub enum SubCmd {
#[default]
Launch,
Install,
Uninstall,
Reinstall,
Start,
Stop,
Restart,
#[clap(hide = true)]
SendCmd {
#[arg(trailing_var_arg = true)]
cmd: Vec<String>,
},
}
fn main() -> Result<()> {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info"))
.target(env_logger::Target::Stderr)
.format(|buf, record| {
writeln!(
buf,
"[{} {} {}:{}] {}",
Local::now().format("%Y-%m-%d %H:%M:%S%.3f"),
record.level(),
record.file().unwrap_or("unknown"),
record.line().unwrap_or(0),
record.args()
)
})
.init();
let service = || service::Service::try_new(service::ID);
match Paneru::parse().subcmd.unwrap_or_default() {
SubCmd::Launch => {
let (sender, receiver) = EventSender::new();
CommandReader::new(sender.clone()).start();
EventHandler::setup_bevy_app(sender, receiver)?.run();
}
SubCmd::Install => service()?.install()?,
SubCmd::Uninstall => service()?.uninstall()?,
SubCmd::Reinstall => service()?.reinstall()?,
SubCmd::Start => service()?.start()?,
SubCmd::Stop => service()?.stop()?,
SubCmd::Restart => service()?.restart()?,
SubCmd::SendCmd { cmd } => CommandReader::send_command(cmd)?,
}
Ok(())
}