wip: modular

This commit is contained in:
Suyono 2023-11-21 11:58:57 +11:00
parent 6df632bc76
commit 97ab962ae2
6 changed files with 47 additions and 46 deletions

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"rust-analyzer.linkedProjects": [
"./Cargo.toml",
]
}

17
src/bin/init.rs Normal file
View File

@ -0,0 +1,17 @@
use std::error;
use wingmate_rs::init;
use tokio::task::{self, JoinHandle};
#[tokio::main]
async fn main() -> Result<(), Box<dyn error::Error>> {
let sig_handler_fn: JoinHandle<Result<(), Box<dyn error::Error + Send + Sync>>> = task::spawn(async {
init::sighandler::sighandler().await
});
if let Err(v) = sig_handler_fn.await? {
return Err(v as Box<dyn error::Error>)
}
Ok(())
}

1
src/init.rs Normal file
View File

@ -0,0 +1 @@
pub mod sighandler;

23
src/init/sighandler.rs Normal file
View File

@ -0,0 +1,23 @@
use std::error;
use tokio::signal::unix::{signal, SignalKind};
use tokio::select;
#[allow(dead_code)]
pub async fn sighandler() -> Result<(), Box<dyn error::Error + Send + Sync>> {
let mut sigint = signal(SignalKind::interrupt())?;
let mut sigterm = signal(SignalKind::terminate())?;
let mut sigchld = signal(SignalKind::child())?;
select! {
_ = sigint.recv() => {
println!("got SIGINT");
},
_ = sigterm.recv() => {
println!("got SIGTERM");
},
_ = sigchld.recv() => {
// return Err(())
},
}
Ok(())
}

1
src/lib.rs Normal file
View File

@ -0,0 +1 @@
pub mod init;

View File

@ -1,46 +0,0 @@
use std::fmt;
use std::error::Error;
use tokio::signal::unix::{signal, SignalKind};
use tokio::select;
use tokio::task::{self, JoinHandle};
#[derive(Debug,Clone)]
struct InvalidState;
impl fmt::Display for InvalidState {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "cannot recover the state")
}
}
impl Error for InvalidState {}
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let sighandler: JoinHandle<Result<(), Box<dyn Error + Send + Sync>>> = task::spawn(async {
let mut sigint = signal(SignalKind::interrupt())?;
let mut sigterm = signal(SignalKind::terminate())?;
let mut sigchld = signal(SignalKind::child())?;
select! {
_ = sigint.recv() => {
println!("got SIGINT");
},
_ = sigterm.recv() => {
println!("got SIGTERM");
return Err(InvalidState.into());
},
_ = sigchld.recv() => {
// return Err(())
},
}
Ok(())
});
if let Err(v) = sighandler.await? {
return Err(v as Box<dyn Error>)
}
Ok(())
}