1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
#![doc = include_str!("../README.md")]
mod config;
pub use crate::config::Config;
pub mod adsb;
pub mod amqp;
pub mod cache;
pub mod grpc;
pub mod rest;
pub use clap::Parser;
/// struct holding cli configuration options
#[derive(Parser, Debug)]
pub struct Cli {
/// Target file to write the OpenAPI Spec
#[arg(long)]
pub openapi: Option<String>,
}
/// Tokio signal handler that will wait for a user to press CTRL+C.
/// This signal handler can be used in our [`axum::Server`] method `with_graceful_shutdown`
/// and in our [`tonic::transport::Server`] method `serve_with_shutdown`.
///
/// # Examples
///
/// ## axum
/// ```
/// use svc_telemetry::shutdown_signal;
/// pub async fn server() {
/// let app = axum::Router::new();
/// axum::Server::bind(&"0.0.0.0:8000".parse().unwrap())
/// .serve(app.into_make_service())
/// .with_graceful_shutdown(shutdown_signal("rest", None));
/// }
/// ```
///
/// ## tonic
/// ```
/// use svc_telemetry::shutdown_signal;
/// pub async fn server() {
/// let (_, health_service) = tonic_health::server::health_reporter();
/// tonic::transport::Server::builder()
/// .add_service(health_service)
/// .serve_with_shutdown("0.0.0.0:50051".parse().unwrap(), shutdown_signal("grpc", None));
/// }
/// ```
///
/// ## using a shutdown signal channel
/// ```
/// use svc_telemetry::shutdown_signal;
/// pub async fn server() {
/// let (shutdown_tx, shutdown_rx) = tokio::sync::oneshot::channel::<()>();
/// let (_, health_service) = tonic_health::server::health_reporter();
/// tokio::spawn(async move {
/// tonic::transport::Server::builder()
/// .add_service(health_service)
/// .serve_with_shutdown("0.0.0.0:50051".parse().unwrap(), shutdown_signal("grpc", Some(shutdown_rx)))
/// .await;
/// });
///
/// // Send server the shutdown request
/// shutdown_tx.send(()).expect("Could not stop server.");
/// }
/// ```
pub async fn shutdown_signal(
server: &str,
shutdown_rx: Option<tokio::sync::oneshot::Receiver<()>>,
) {
match shutdown_rx {
Some(receiver) => receiver
.await
.expect("(shutdown_signal) expect tokio signal oneshot Receiver"),
None => tokio::signal::ctrl_c()
.await
.expect("(shutdown_signal) expect tokio signal ctrl-c"),
}
log::warn!("(shutdown_signal) server shutdown for [{}]", server);
}