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).unwrap_or(default_val.to_string())
13}
14
15pub 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 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 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
64pub use tokio;