Crate ceviche[−][src]
ceviche is a wrapper to write a service/daemon.
At the moment only Windows services are supported. The Service macro is inspired from the winservice crate.
A service implements a service main function and is generated by invoking
the Service!
macro. The events are sent to the service over the rx
channel.
ⓘThis example is not tested
enum CustomServiceEvent {} fn my_service_main( rx: mpsc::Receiver<ServiceEvent<CustomServiceEvent>>, _tx: mpsc::Sender<ServiceEvent<CustomServiceEvent>>, args: Vec<String>, standalone_mode: bool) -> u32 { loop { if let Ok(control_code) = rx.recv() { match control_code { ServiceEvent::Stop => break, _ => (), } } } 0 } Service!("Foobar", my_service_main);
The Controller is a helper to create, remove, start or stop the service on the system. ceviche also supports a standalone mode were the service code runs as a normal executable which can be useful for development and debugging.
ⓘThis example is not tested
static SERVICE_NAME: &'static str = "foobar"; static DISPLAY_NAME: &'static str = "FooBar Service"; static DESCRIPTION: &'static str = "This is the FooBar service"; fn main() { let yaml = load_yaml!("cli.yml"); let app = App::from_yaml(yaml); let matches = app.version(crate_version!()).get_matches(); let cmd = matches.value_of("cmd").unwrap_or("").to_string(); let mut controller = Controller::new(SERVICE_NAME, DISPLAY_NAME, DESCRIPTION); match cmd.as_str() { "create" => controller.create(), "delete" => controller.delete(), "start" => controller.start(), "stop" => controller.stop(), "standalone" => { let (tx, rx) = mpsc::channel(); ctrlc::set_handler(move || { let _ = tx.send(ServiceEvent::Stop); }).expect("Failed to register Ctrl-C handler"); my_service_main(rx, vec![], true); } _ => { let _result = controller.register(service_main_wrapper); } } }
Modules
controller |
Manages the service on the system. |
Macros
Service |
Generates a |
Structs
Error |
Service errors |
Enums
ServiceEvent |
Events that are sent to the service. |