diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/mod.rs | 10 | ||||
| -rw-r--r-- | src/server/shutdown/mod.rs | 29 | ||||
| -rw-r--r-- | src/server/state/database.rs | 17 | ||||
| -rw-r--r-- | src/server/state/mod.rs | 17 |
4 files changed, 73 insertions, 0 deletions
diff --git a/src/server/mod.rs b/src/server/mod.rs new file mode 100644 index 0000000..803135f --- /dev/null +++ b/src/server/mod.rs @@ -0,0 +1,10 @@ +use axum::Router; + +use crate::{config::Config, server::state::AppState}; + +pub mod shutdown; +pub mod state; + +pub async fn router(config: &Config, state: AppState) -> anyhow::Result<Router<()>> { + todo!() +} diff --git a/src/server/shutdown/mod.rs b/src/server/shutdown/mod.rs new file mode 100644 index 0000000..0e89a0c --- /dev/null +++ b/src/server/shutdown/mod.rs @@ -0,0 +1,29 @@ +use tokio::signal; + +pub async fn shutdown_signal() { + let ctrl_c = async { + signal::ctrl_c() + .await + .expect("failed to install Ctrl+C handler"); + }; + + #[cfg(unix)] + let terminate = async { + signal::unix::signal(signal::unix::SignalKind::terminate()) + .expect("failed to install signal handler") + .recv() + .await; + }; + + #[cfg(not(unix))] + let terminate = std::future::pending::<()>(); + + tokio::select! { + _ = ctrl_c => { + tracing::info!("Received Ctrl+C, starting graceful shutdown"); + }, + _ = terminate => { + tracing::info!("Received SIGTERM, starting graceful shutdown"); + }, + } +} diff --git a/src/server/state/database.rs b/src/server/state/database.rs new file mode 100644 index 0000000..32d3f98 --- /dev/null +++ b/src/server/state/database.rs @@ -0,0 +1,17 @@ +use anyhow::Result; +use sqlx::{PgPool, postgres::PgPoolOptions}; +use tracing::{debug, trace}; + +use crate::config::DatabaseOptions; + + +pub(super) async fn connect(opts: &DatabaseOptions) -> Result<PgPool> { + trace!(host = ?opts.url.host(), "connecting to database"); + let pg = PgPoolOptions::new() + .max_connections(opts.pool_size) + .connect(opts.url.as_str()) + .await?; + debug!(host = ?opts.url.host(), "connected to database"); + + Ok(pg) +} diff --git a/src/server/state/mod.rs b/src/server/state/mod.rs new file mode 100644 index 0000000..f4bf029 --- /dev/null +++ b/src/server/state/mod.rs @@ -0,0 +1,17 @@ +pub mod database; + +use sqlx::PgPool; + +use crate::{config::Config}; + +pub struct AppState { + database: PgPool, +} + +impl AppState { + pub async fn new(config: &Config) -> anyhow::Result<Self> { + let database = database::connect(&config.database).await?; + + Ok(Self{database}) + } +} |
