diff --git a/Cargo.lock b/Cargo.lock index 78ce547..56c38ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -970,6 +970,16 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1815,6 +1825,7 @@ dependencies = [ "tokio", "toml", "tower", + "tower-http", ] [[package]] @@ -1871,6 +1882,19 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-util" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml" version = "0.5.9" @@ -1909,7 +1933,13 @@ dependencies = [ "http", "http-body", "http-range-header", + "httpdate", + "mime", + "mime_guess", + "percent-encoding", "pin-project-lite", + "tokio", + "tokio-util", "tower", "tower-layer", "tower-service", @@ -2037,6 +2067,15 @@ dependencies = [ "unic-common", ] +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.8" diff --git a/Cargo.toml b/Cargo.toml index 9d51b3b..e46d06e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,5 +18,6 @@ thiserror = "1.0.32" tokio = { version = "1.20.1", features = ["full"] } toml = "0.5.9" tower = "0.4.13" +tower-http = { version = "0.3.4", features = ["fs"] } [features] diff --git a/src/main.rs b/src/main.rs index db1a618..7669472 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ use axum::response::Html; use axum::response::IntoResponse; use axum::response::Redirect; use axum::response::Response; +use axum::routing::get_service; use axum::{ routing::{get, post}, Router, @@ -25,6 +26,7 @@ use tasks::Task; use tera::Tera; use thiserror::Error as ThisError; use tower::ServiceBuilder; +use tower_http::services::ServeDir; #[derive(ThisError, Debug)] pub enum Error { @@ -94,6 +96,7 @@ pub struct Config { secret: String, connection_string: String, template_dir: Option, + static_dir: Option, } #[tokio::main] @@ -128,6 +131,16 @@ async fn main() -> Result<(), Error> { .route("/create", get(tasks::create_form)) .route("/create", post(tasks::create_backend)); + let serve_dir = get_service(ServeDir::new( + config.static_dir.unwrap_or_else(|| "static".into()), + )) + .handle_error(|e: std::io::Error| async move { + ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Unhandled server error: {}", e), + ) + }); + let app = Router::new() .route("/", get(homepage)) .route("/register", post(users::create_user)) @@ -135,6 +148,7 @@ async fn main() -> Result<(), Error> { .route("/login", get(users::login_form)) .route("/login", post(users::login_backend)) .nest("/tasks", task_routes) + .nest("/static", serve_dir) .layer( ServiceBuilder::new() .layer(Extension(pool)) diff --git a/static/style.css b/static/style.css new file mode 100644 index 0000000..0696e40 --- /dev/null +++ b/static/style.css @@ -0,0 +1,8 @@ +.wrapper { + /* Text margin */ + margin: auto; + width: 60%; + padding: 10px; + perspective: 1000px; +} + diff --git a/templates/base.html b/templates/base.html index 04475bd..7d36cef 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,8 +1,11 @@ 2m2d + +
{% block content %}{% endblock %} +