mod argp;
mod err;
mod procres;
use std::{sync::mpsc, time::Duration};
use qsu::{
argp::ArgParser,
rt::{InitCtx, RunEnv, ServiceHandler, SrvAppRt, SvcEvt, TermCtx},
set_default_log_filters
};
use err::Error;
use procres::ProcRes;
mod foo {
mod subfoo {
pub fn say_hello() {
log::error!("Hello error from subfoo");
log::warn!("Hello warn from subfoo");
log::info!("Hello info from subfoo");
log::debug!("Hello debug from subfoo");
log::trace!("Hello trace from subfoo");
}
}
pub fn say_hello() {
log::error!("Hello error from foo");
log::warn!("Hello warn from foo");
log::info!("Hello info from foo");
log::debug!("Hello debug from foo");
log::trace!("Hello trace from foo");
subfoo::say_hello();
}
}
mod bar {
pub fn say_hello() {
log::error!("Hello error from bar");
log::warn!("Hello warn from bar");
log::info!("Hello info from bar");
log::debug!("Hello debug from bar");
log::trace!("Hello trace from bar");
}
}
mod baz {
pub fn say_hello() {
log::error!("Hello error from baz");
log::warn!("Hello warn from baz");
log::info!("Hello info from baz");
log::debug!("Hello debug from baz");
log::trace!("Hello trace from baz");
}
}
mod buzz {
pub fn say_hello() {
log::error!("Hello error from buzz");
log::warn!("Hello warn from buzz");
log::info!("Hello info from buzz");
log::debug!("Hello debug from buzz");
log::trace!("Hello trace from buzz");
}
}
struct MyService {
rx: mpsc::Receiver<SvcEvt>
}
impl ServiceHandler for MyService {
type AppErr = Error;
fn init(&mut self, ictx: &mut InitCtx) -> Result<(), Self::AppErr> {
log::trace!("Running init()");
ictx.report(Some("Entered init"));
log::info!("Calling foo's say_hello()");
foo::say_hello();
log::info!("Calling bar's say_hello()");
bar::say_hello();
log::info!("Calling baz's say_hello()");
baz::say_hello();
log::info!("Calling buzz's say_hello()");
buzz::say_hello();
Ok(())
}
fn run(&mut self, _re: &RunEnv) -> Result<(), Self::AppErr> {
log::info!("Wait for termination event for up to 2 seconds ..");
loop {
let Ok(evt) = self.rx.recv_timeout(Duration::from_secs(2)) else {
break;
};
if let SvcEvt::Shutdown(_) = evt {
break;
}
}
Ok(())
}
fn shutdown(&mut self, tctx: &mut TermCtx) -> Result<(), Self::AppErr> {
tctx.report(Some("Entered shutdown"));
log::trace!("Running shutdown()");
Ok(())
}
}
fn main() -> ProcRes {
ProcRes::into(main2().into())
}
fn main2() -> Result<(), Error> {
set_default_log_filters(&[
("hellosvc_logging::foo", log::LevelFilter::Info),
("hellosvc_logging::bar", log::LevelFilter::Warn),
("hellosvc_logging::baz", log::LevelFilter::Trace),
("qsu", log::LevelFilter::Trace)
]);
let svcname = qsu::default_service_name()
.expect("Unable to determine default service name");
let bldr = Box::new(|| {
let (tx, rx) = mpsc::channel();
SrvAppRt::Sync {
svcevt_handler: Box::new(move |msg| {
tx.send(msg).unwrap();
}),
rt_handler: Box::new(MyService { rx })
}
});
let mut argsproc = argp::AppArgsProc { bldr };
let ap =
ArgParser::new(&svcname, &mut argsproc).regsvc_proc(|mut regsvc| {
if regsvc.description.is_none() {
regsvc.description_ref("A sync server used to test logging");
}
regsvc
});
ap.proc()?;
Ok(())
}