summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorCara Salter <cara@devcara.com>2022-05-27 23:13:52 -0400
committerCara Salter <cara@devcara.com>2022-05-27 23:13:52 -0400
commit372b484e8a6366346d52ff44bbdaa6aad1cc2daa (patch)
tree29b9f5c2dcd07c54057fc86a8f0cc5861b8c0a6d /src/main.rs
parentca5c737f047119f31e42a8700b8ae1ad4fabd17a (diff)
downloadhomeworld-372b484e8a6366346d52ff44bbdaa6aad1cc2daa.tar.gz
homeworld-372b484e8a6366346d52ff44bbdaa6aad1cc2daa.zip
initial axum scaffold
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs64
1 files changed, 62 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs
index e7a11a9..ba319d9 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,63 @@
-fn main() {
- println!("Hello, world!");
+use axum::{
+ error_handling::HandleErrorLayer,
+ http::StatusCode,
+ response::IntoResponse,
+ routing::get,
+ Json, Router
+};
+
+use serde::{Deserialize, Serialize};
+use std::{net::SocketAddr, time::Duration, str::FromStr};
+
+use tower::{BoxError, ServiceBuilder};
+use tower_http::trace::TraceLayer;
+
+use tracing_subscriber::prelude::*;
+
+mod errors;
+
+mod handlers;
+
+#[tokio::main]
+async fn main() {
+ kankyo::init();
+ color_eyre::install().unwrap();
+ tracing_subscriber::registry()
+ .with(tracing_subscriber::EnvFilter::new(
+ std::env::var("RUST_LOG")
+ .unwrap_or_else(|_| "waifud=info,tower_http=debug".into()),
+ ))
+ .with(tracing_subscriber::fmt::layer())
+ .init();
+
+ let app = Router::new()
+ .route("/health", get(health_check))
+ .route("/waifus/list", get(handlers::waifus::list))
+ .layer( ServiceBuilder::new()
+ .layer(HandleErrorLayer::new(|error: BoxError| async move {
+ if error.is::<tower::timeout::error::Elapsed>() {
+ Ok(StatusCode::REQUEST_TIMEOUT)
+ } else {
+ Err((
+ StatusCode::INTERNAL_SERVER_ERROR,
+ format!("Unhandled internal error: {}", error),
+ ))
+ }
+ }))
+ .timeout(Duration::from_secs(10))
+ .layer(TraceLayer::new_for_http())
+ .into_inner(),
+ );
+
+ let addr = SocketAddr::from_str(std::env::var("BIND_ADDR").unwrap().as_str().into()).unwrap();
+ tracing::info!("Listening on {}", addr);
+
+ axum::Server::bind(&addr)
+ .serve(app.into_make_service())
+ .await
+ .unwrap();
+}
+
+async fn health_check() -> &'static str {
+ "OK"
}