use clap::{ArgMatches, Command};
use qsu::{
argp::Cmd,
installer::RegSvc,
rt::{RunCtx, SrvAppRt}
};
use crate::err::Error;
pub struct AppArgsProc {
pub(crate) bldr: Box<dyn Fn() -> SrvAppRt<Error>>
}
impl qsu::argp::ArgsProc for AppArgsProc {
type AppErr = Error;
fn conf_cmd(
&mut self,
cmdtype: Cmd,
cmd: Command
) -> Result<Command, Self::AppErr> {
let cmd = if cmdtype == Cmd::Root {
cmd
.name(env!("CARGO_BIN_NAME"))
.version(env!("CARGO_PKG_VERSION"))
} else {
cmd
};
Ok(cmd)
}
fn proc_inst(
&mut self,
_sub_m: &ArgMatches,
regsvc: RegSvc
) -> Result<RegSvc, Self::AppErr> {
proc_inst_inner(regsvc)
}
fn build_apprt(
&mut self,
_runctx: &mut RunCtx
) -> Result<SrvAppRt<Error>, Self::AppErr> {
Ok((self.bldr)())
}
}
fn proc_inst_inner(regsvc: RegSvc) -> Result<RegSvc, Error> {
let cwd = std::env::current_dir()?.to_str().unwrap().to_string();
let mut regsvc = regsvc
.workdir(cwd)
.env("HOLY", "COW")
.env("Private", "Public")
.env("General", "Specific");
if regsvc.display_name.is_none() {
regsvc.display_name_ref("Hello Service");
}
let regsvc = regsvc.conf_reload();
#[cfg(windows)]
let regsvc = regsvc.regconf(|_svcname, params| {
params.set_string("AppArgParser", "SaysHello")?;
Ok(())
});
Ok(regsvc)
}