summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorAdam T. Carpenter <atc@53hor.net>2024-11-14 21:49:47 -0500
committerAdam T. Carpenter <atc@53hor.net>2024-11-14 21:49:47 -0500
commit4aa45ef3e7798ee18bea8b49af75e383afce02a1 (patch)
tree7a1353753d9300929b43a561ff2f1aae59b6434f /src/main.rs
parent014e34fa4a8cd4e3cdb3573a7748696c68873523 (diff)
parentfc0e8296178ca779a270d91b681777f50b3b626d (diff)
downloadcarpentertutoring-4aa45ef3e7798ee18bea8b49af75e383afce02a1.tar.xz
carpentertutoring-4aa45ef3e7798ee18bea8b49af75e383afce02a1.zip
Merge branch 'release'HEADmaster
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..252588d
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,61 @@
+use tower::Layer;
+use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
+use tower_http::{trace::{self, TraceLayer}, normalize_path::NormalizePathLayer};
+use tracing::{info, Level};
+use axum::{routing::get, Router, ServiceExt, extract::Request};
+use tutors::fs_tutor_repo::FsTutorRepo;
+use std::{sync::Arc, env};
+use tower_http::services::ServeDir;
+use posts::fs_post_repo::FsPostRepo;
+
+mod helpers;
+mod posts;
+mod tutors;
+mod views;
+mod handlers;
+
+#[tokio::main]
+async fn main() {
+ let tracing_filter = EnvFilter::builder()
+ .with_env_var("CT_LOG")
+ .try_from_env()
+ .unwrap_or("carpentertutoring=debug,tower_http=debug,axum::rejection=trace".into());
+ tracing_subscriber::registry()
+ .with(tracing_filter)
+ .with(tracing_subscriber::fmt::layer())
+ .init();
+
+ info!("loading state...");
+ let blog_dir = env::var("CT_POSTS").unwrap();
+ let tutor_dir = env::var("CT_TEAM").unwrap();
+ let assets_dir = env::var("CT_ASSETS").unwrap();
+
+ let posts = Arc::new(FsPostRepo::with_dir(blog_dir));
+ let tutors = Arc::new(FsTutorRepo::with_dir(tutor_dir.clone()));
+
+ info!("initializing router...");
+ let app = Router::new()
+ .route("/", get(handlers::index_handler))
+ .route("/posts", get(handlers::posts_handler))
+ .route("/posts/:post_id", get(handlers::post_handler))
+ .with_state(posts)
+ .route("/policies", get(handlers::policies_handler))
+ .route("/brochure", get(handlers::brochure_handler))
+ .route("/about", get(handlers::about_handler))
+ .with_state(tutors)
+ .nest_service("/assets", ServeDir::new(assets_dir))
+ .nest_service("/team", ServeDir::new(tutor_dir))
+ .fallback_service(ServeDir::new("static"))
+ .layer(
+ TraceLayer::new_for_http()
+ .make_span_with(trace::DefaultMakeSpan::new()
+ .level(Level::INFO))
+ .on_response(trace::DefaultOnResponse::new()
+ .level(Level::INFO))
+ );
+ let app = NormalizePathLayer::trim_trailing_slash().layer(app);
+
+ let addr = env::var("CT_BIND").unwrap_or("0.0.0.0:8000".into());
+ let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
+ axum::serve(listener, ServiceExt::<Request>::into_make_service(app)).await.unwrap();
+}