summaryrefslogtreecommitdiffstats
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs52
1 files changed, 47 insertions, 5 deletions
diff --git a/src/main.rs b/src/main.rs
index 7b5d3c2..f2b81ae 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,18 +1,60 @@
+use tokio::net::TcpListener;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
+use unnamed_server::state::AppState;
+
+use crate::config::Config;
+
+mod config;
#[tokio::main]
#[tracing::instrument]
async fn main() -> Result<(), unnamed_server::Error> {
tracing_subscriber::registry()
.with(
- tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| {
- "example_tracing_aka_logging=debug,tower_http=debug,axum::rejection=trace".into()
- }),
+ tracing_subscriber::EnvFilter::try_from_default_env()
+ .unwrap_or_else(|_| "unnamed_server=debug".into()),
)
.with(tracing_subscriber::fmt::layer())
.init();
- let socket_addr = std::net::SocketAddr::from(([127, 0, 0, 1], 30000));
+ let _ = dotenvy::dotenv();
+
+ let config = Config::init();
+
+ let state = AppState::new(config.database_url).await?;
+
+ let app = unnamed_server::router(state);
+
+ let listener = TcpListener::bind("127.0.0.1:30000").await?;
+
+ tracing::info!("Server listening on http://{}", listener.local_addr()?);
+
+ axum::serve(listener, app)
+ .with_graceful_shutdown(shutdown_signal())
+ .await
+ .map_err(From::from)
+}
+
+async fn shutdown_signal() {
+ let ctrl_c = async {
+ tokio::signal::ctrl_c()
+ .await
+ .expect("failed to install Ctrl+C handler");
+ };
+
+ #[cfg(unix)]
+ let terminate = async {
+ tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate())
+ .expect("failed to install signal handler")
+ .recv()
+ .await;
+ };
+
+ #[cfg(not(unix))]
+ let terminate = std::future::pending::<()>();
- unnamed_server::serve(socket_addr).await
+ tokio::select! {
+ _ = ctrl_c => {},
+ _ = terminate => {},
+ }
}