summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock83
-rw-r--r--Cargo.toml2
-rw-r--r--src/cli.rs3
-rw-r--r--src/lib.rs1
-rw-r--r--src/ui.rs38
-rwxr-xr-xtools/build-ui9
-rwxr-xr-xtools/run1
7 files changed, 136 insertions, 1 deletions
diff --git a/Cargo.lock b/Cargo.lock
index b1f0582..638735f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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"
diff --git a/Cargo.toml b/Cargo.toml
index 2b2e774..a9cae7d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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"] }
diff --git a/src/cli.rs b/src/cli.rs
index 2d9f512..8b39451 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -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)
diff --git a/src/lib.rs b/src/lib.rs
index 8ec13da..59cf0f2 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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
diff --git a/tools/run b/tools/run
index b063eb7..452355e 100755
--- a/tools/run
+++ b/tools/run
@@ -4,4 +4,5 @@
##
## Run the server in development mode. Shorthand for `cargo run`.
+tools/build-ui
cargo run -- "$@"