summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Hafskjold Thoresen <martin@vind.ai>2025-01-04 13:11:57 +0100
committerMartin Hafskjold Thoresen <martin@vind.ai>2025-01-04 13:11:57 +0100
commit7a049d3acf49af248700e18568ee18ee9e99fc9c (patch)
treeddb0f8ced9316e1918b0bb75a5cfb63d8f67c5b0 /src
parent6551d2e70cc48fcc699bb1c6f4dc94ca6e794dd1 (diff)
downloadmusicgame-7a049d3acf49af248700e18568ee18ee9e99fc9c.tar.gz
musicgame-7a049d3acf49af248700e18568ee18ee9e99fc9c.zip
Basics up
Diffstat (limited to 'src')
-rw-r--r--src/main.rs57
1 files changed, 55 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs
index e7a11a9..e078a32 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,56 @@
-fn main() {
- println!("Hello, world!");
+use std::net::SocketAddr;
+
+use anyhow::{Context, Result};
+use axum::{
+ http::StatusCode,
+ response::{IntoResponse, Response},
+ routing::get,
+ Router,
+};
+use tower_http::{
+ catch_panic::CatchPanicLayer,
+ trace::{self, TraceLayer},
+};
+use tracing::{error, info, Level};
+use tracing_subscriber::FmtSubscriber;
+
+fn handle_panic(err: Box<dyn std::any::Any + Send + 'static>) -> Response {
+ let details = if let Some(s) = err.downcast_ref::<String>() {
+ s.clone()
+ } else if let Some(s) = err.downcast_ref::<&str>() {
+ s.to_string()
+ } else {
+ "Unknown panic message".to_string()
+ };
+ error!(details = details, "Handler paniced");
+
+ (StatusCode::INTERNAL_SERVER_ERROR).into_response()
+}
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let subscriber = FmtSubscriber::builder()
+ .with_max_level(Level::TRACE)
+ .finish();
+ tracing::subscriber::set_global_default(subscriber)
+ .expect("set global default subscriber failed");
+
+ let app = Router::new()
+ .route("/", get(|| async { "wat" }))
+ .layer(CatchPanicLayer::custom(handle_panic))
+ .layer(
+ TraceLayer::new_for_http()
+ .make_span_with(trace::DefaultMakeSpan::new().level(Level::INFO))
+ .on_response(trace::DefaultOnResponse::new().level(Level::INFO)),
+ );
+
+ let addr = "0.0.0.0:4800";
+ info!("Listening on {addr}");
+ let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
+ axum::serve(
+ listener,
+ app.into_make_service_with_connect_info::<SocketAddr>(),
+ )
+ .await
+ .context("serve")
}