novax_services/
lib.rs

1mod svc;
2pub mod error;
3
4use tokio::sync::oneshot;
5use tokio::task::JoinHandle;
6
7use error::{Error, Result};
8use novax_log::log as log;
9
10fn get_addr<'a>( lookup: &'a str, default_val: &'a str) -> String {
11    // std::env::var(lookup).map_err(|_| default_val.to_string()).unwrap()
12    std::env::var(lookup).unwrap_or(default_val.to_string())
13}
14
15//  runtime provide from invoker
16pub async fn service(addr: String) -> Result<()> {
17   
18    #[cfg(feature = "grpc")]
19    {
20        let (ctrlc_h, rx) = ctrl_c_handler()?;
21        let addr = if &addr == "" { get_addr("GRPC_ADDR", "[::1]:50055") } else { addr.clone() };
22        let _ = svc::grpc_svc(addr, async move{
23            // todo
24            let _ = rx.await;
25        }).await;
26        let _ = ctrlc_h.await;
27    }
28
29    #[cfg(feature = "http")]
30    {
31        let (ctrlc_h, rx) = ctrl_c_handler()?;
32        let addr = if &addr == "" { get_addr("HTTP_ADDR", "127.0.0.1:9091") } else { addr.clone() };
33        let _ = svc::http_svc(addr, rx).await;
34        println!(" http service shoud ne aex ");
35        let _ = ctrlc_h.await;
36    }
37    // let fut_values = async {
38    // };
39    // fut_values.await;
40    Ok(())
41}
42
43
44fn ctrl_c_handler() -> Result::<(JoinHandle::<bool>, oneshot::Receiver::<bool>)> {
45    let (tx, rx) = oneshot::channel::<bool>();
46    Ok (
47        (
48            tokio::task::spawn_blocking(
49                move || {
50                    let _ = tokio::spawn(async move{
51                        tokio::signal::ctrl_c().await?;
52                        let _ = tx.send(true);
53                        log::info!(" ctrl + c receive ");
54                        Ok::<(), Error>(())
55                    });
56                    true
57                }
58            ),
59            rx
60        )
61    )
62}
63
64// re-export
65pub use tokio;