#[cfg(windows)]
pub mod windows_ffi_service_main;
#[cfg(windows)]
pub mod windows_simple_service;
use std::sync::mpsc::channel;
use std::sync::mpsc::Receiver;
pub type ServiceMain<T> =
dyn Fn(Receiver<T>, Vec<String>, Option<Vec<String>>) -> anyhow::Result<T> + Sync + Send;
#[cfg(windows)]
use windows_service_detector::is_running_as_windows_service;
#[cfg(windows)]
use windows_simple_service::run_simple_service;
#[cfg(windows)]
pub fn universal_service_main(
service_name: String,
service_main: Box<ServiceMain<()>>,
) -> anyhow::Result<()> {
if is_running_as_windows_service().expect("failed to detect windows service environment") {
run_simple_service(service_name, service_main)?;
} else {
run_simple_nonservice(service_name, service_main)?;
}
Ok(())
}
#[cfg(not(windows))]
pub fn universal_service_main(
service_name: String,
service_main: Box<ServiceMain<()>>,
) -> anyhow::Result<()> {
run_simple_nonservice(service_name, service_main)?;
Ok(())
}
pub fn run_simple_nonservice(
_service_name: String,
service_main: Box<ServiceMain<()>>,
) -> anyhow::Result<()> {
let (shutdown_tx, shutdown_rx) = channel();
ctrlc::set_handler(move || {
let _ = shutdown_tx.send(());
})
.expect("failed to set signal handler");
service_main(shutdown_rx, std::env::args().collect(), None)?;
Ok(())
}