first commit

This commit is contained in:
Mateusz Gruszczyński
2026-07-17 15:29:08 +02:00
commit 771494671b
35 changed files with 5020 additions and 0 deletions
+67
View File
@@ -0,0 +1,67 @@
mod api;
mod app;
mod config;
mod db;
mod state;
mod websocket;
use std::{net::SocketAddr, sync::Arc};
use config::Config;
use sqlx::sqlite::SqlitePoolOptions;
use state::AppState;
use tokio::net::TcpListener;
use tracing::info;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenvy::dotenv().ok();
init_tracing();
let config = Config::from_env()?;
let db = SqlitePoolOptions::new()
.max_connections(config.database_max_connections)
.connect(&config.database_url)
.await?;
sqlx::migrate!().run(&db).await?;
let state = Arc::new(AppState::new(db, config.asset_version.clone()));
let app = app::router(state, &config.static_dir);
let address = SocketAddr::new(config.host, config.port);
let listener = TcpListener::bind(address).await?;
info!(%address, asset_version = %config.asset_version, "RustPad is running");
axum::serve(listener, app)
.with_graceful_shutdown(shutdown_signal())
.await?;
Ok(())
}
fn init_tracing() {
tracing_subscriber::registry()
.with(
tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| "rustpad=debug,tower_http=info".into()),
)
.with(tracing_subscriber::fmt::layer())
.init();
}
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 SIGTERM handler")
.recv()
.await;
};
#[cfg(not(unix))]
let terminate = std::future::pending::<()>();
tokio::select! { () = ctrl_c => {}, () = terminate => {} }
}