diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2024-09-28 00:38:42 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2024-10-05 18:16:26 -0400 |
| commit | ec51666002900faa389ff0c8f34ed32c663bd723 (patch) | |
| tree | d3de7810df562128ddacac1dcb57b199acdfe2a3 | |
| parent | 671b36c2c8d4026eb7a34f0ac7bd5720b34f1a0d (diff) | |
Render the UI at /.
| -rw-r--r-- | Cargo.lock | 83 | ||||
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | src/cli.rs | 3 | ||||
| -rw-r--r-- | src/lib.rs | 1 | ||||
| -rw-r--r-- | src/ui.rs | 38 | ||||
| -rwxr-xr-x | tools/build-ui | 9 | ||||
| -rwxr-xr-x | tools/run | 1 |
7 files changed, 136 insertions, 1 deletions
@@ -788,9 +788,11 @@ dependencies = [ "futures", "headers", "itertools", + "mime_guess", "password-hash", "rand", "rand_core", + "rust-embed", "serde", "serde_json", "sqlx", @@ -1064,6 +1066,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] name = "minimal-lexical" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1361,6 +1373,40 @@ dependencies = [ ] [[package]] +name = "rust-embed" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" +dependencies = [ + "proc-macro2", + "quote", + "rust-embed-utils", + "syn", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" +dependencies = [ + "sha2", + "walkdir", +] + +[[package]] name = "rustc-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1392,6 +1438,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2001,6 +2056,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[package]] name = "unicode-bidi" version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2072,6 +2136,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2149,6 +2223,15 @@ dependencies = [ ] [[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] name = "windows-core" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -13,9 +13,11 @@ clap = { version = "4.5.18", features = ["derive", "env"] } futures = "0.3.30" headers = "0.4.0" itertools = "0.13.0" +mime_guess = "2.0.5" password-hash = { version = "0.5.0", features = ["std"] } rand = "0.8.5" rand_core = { version = "0.6.4", features = ["getrandom"] } +rust-embed = "8.5.0" serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.128" sqlx = { version = "0.8.2", features = ["chrono", "runtime-tokio", "sqlite"] } @@ -10,7 +10,7 @@ use clap::Parser; use sqlx::sqlite::SqlitePool; use tokio::net; -use crate::{app::App, channel, clock, db, event, expire, login, message}; +use crate::{app::App, channel, clock, db, event, expire, login, message, ui}; /// Command-line entry point for running the `hi` server. /// @@ -110,6 +110,7 @@ fn routers() -> Router<App> { event::router(), login::router(), message::router(), + ui::router(), ] .into_iter() .fold(Router::default(), Router::merge) @@ -17,3 +17,4 @@ mod message; #[cfg(test)] mod test; mod token; +mod ui; diff --git a/src/ui.rs b/src/ui.rs new file mode 100644 index 0000000..bba01cc --- /dev/null +++ b/src/ui.rs @@ -0,0 +1,38 @@ +use axum::{ + extract::Path, + http::{header, StatusCode}, + response::IntoResponse, + routing::get, + Router, +}; + +#[derive(rust_embed::Embed)] +#[folder = "hi-ui/build"] +struct Assets; + +async fn root() -> impl IntoResponse { + asset(Path(String::from("index.html"))).await +} + +async fn asset(Path(path): Path<String>) -> impl IntoResponse { + let mime = mime_guess::from_path(&path).first_or_octet_stream(); + + match Assets::get(&path) { + Some(file) => ( + StatusCode::OK, + [(header::CONTENT_TYPE, mime.as_ref())], + file.data, + ) + .into_response(), + None => (StatusCode::NOT_FOUND, "").into_response(), + } +} + +pub fn router<S>() -> Router<S> +where + S: Clone + Send + Sync + 'static, +{ + Router::new() + .route("/*path", get(asset)) + .route("/", get(root)) +} diff --git a/tools/build-ui b/tools/build-ui new file mode 100755 index 0000000..a7ed9a5 --- /dev/null +++ b/tools/build-ui @@ -0,0 +1,9 @@ +#!/bin/bash -e + +## tools/build-ui +## +## Builds the Svelte UI. + +cd "$(dirname "$0")/../hi-ui" + +npm run build @@ -4,4 +4,5 @@ ## ## Run the server in development mode. Shorthand for `cargo run`. +tools/build-ui cargo run -- "$@" |
