+11
-1
.cargo/config.toml
+11
-1
.cargo/config.toml
···
1
1
[target.x86_64-unknown-linux-gnu]
2
2
linker = "clang"
3
-
rustflags = ["-C", "link-arg=-fuse-ld=lld"]
3
+
rustflags = [
4
+
"-C",
5
+
"link-arg=-fuse-ld=lld",
6
+
"-Zshare-generics=n",
7
+
"-Zthreads=0",
8
+
]
4
9
5
10
[target.x86_64-pc-windows-msvc]
6
11
linker = "rust-lld.exe"
12
+
rustdocflags = ["-Clinker=rust-lld.exe"]
13
+
rustflags = [
14
+
"-Zshare-generics=n",
15
+
"-Zthreads=0",
16
+
]
7
17
8
18
[unstable]
9
19
codegen-backend = true
+19
-37
Cargo.lock
+19
-37
Cargo.lock
···
329
329
]
330
330
331
331
[[package]]
332
+
name = "fun-html"
333
+
version = "1.8.0"
334
+
source = "git+https://github.com/90-008/fun-html.git#04cdde83b4b548083712ad487e3310683785531c"
335
+
dependencies = [
336
+
"axum-core",
337
+
"html-escape",
338
+
]
339
+
340
+
[[package]]
332
341
name = "futures-channel"
333
342
version = "0.3.31"
334
343
source = "registry+https://github.com/rust-lang/crates.io-index"
···
545
554
]
546
555
547
556
[[package]]
548
-
name = "hypertext"
549
-
version = "0.12.1"
550
-
source = "registry+https://github.com/rust-lang/crates.io-index"
551
-
checksum = "eb73b82c6a76434fd87a0668ef3ff1a8182512dfb610eef9138169a7e2d3a0ed"
552
-
dependencies = [
553
-
"axum-core",
554
-
"html-escape",
555
-
"hypertext-macros",
556
-
"itoa",
557
-
"ryu",
558
-
]
559
-
560
-
[[package]]
561
-
name = "hypertext-macros"
562
-
version = "0.12.1"
563
-
source = "registry+https://github.com/rust-lang/crates.io-index"
564
-
checksum = "c120534b9d41bd317a5b111aacc38a34071d15df9462c0e21f6093ade3a03660"
565
-
dependencies = [
566
-
"html-escape",
567
-
"proc-macro2",
568
-
"quote",
569
-
"syn",
570
-
]
571
-
572
-
[[package]]
573
557
name = "icu_collections"
574
558
version = "2.0.0"
575
559
source = "registry+https://github.com/rust-lang/crates.io-index"
···
1041
1025
1042
1026
[[package]]
1043
1027
name = "regex"
1044
-
version = "1.11.1"
1028
+
version = "1.11.2"
1045
1029
source = "registry+https://github.com/rust-lang/crates.io-index"
1046
-
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
1030
+
checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912"
1047
1031
dependencies = [
1048
1032
"aho-corasick",
1049
1033
"memchr",
1050
-
"regex-automata 0.4.9",
1051
-
"regex-syntax 0.8.5",
1034
+
"regex-automata 0.4.10",
1035
+
"regex-syntax 0.8.6",
1052
1036
]
1053
1037
1054
1038
[[package]]
···
1062
1046
1063
1047
[[package]]
1064
1048
name = "regex-automata"
1065
-
version = "0.4.9"
1049
+
version = "0.4.10"
1066
1050
source = "registry+https://github.com/rust-lang/crates.io-index"
1067
-
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
1051
+
checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6"
1068
1052
dependencies = [
1069
1053
"aho-corasick",
1070
1054
"memchr",
1071
-
"regex-syntax 0.8.5",
1055
+
"regex-syntax 0.8.6",
1072
1056
]
1073
1057
1074
1058
[[package]]
···
1079
1063
1080
1064
[[package]]
1081
1065
name = "regex-syntax"
1082
-
version = "0.8.5"
1066
+
version = "0.8.6"
1083
1067
source = "registry+https://github.com/rust-lang/crates.io-index"
1084
-
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
1068
+
checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001"
1085
1069
1086
1070
[[package]]
1087
1071
name = "reqwest"
···
1295
1279
"anyhow",
1296
1280
"axum",
1297
1281
"axum-htmx",
1298
-
"hypertext",
1282
+
"fun-html",
1299
1283
"reqwest",
1300
1284
"scc",
1301
-
"serde",
1302
-
"serde_json",
1303
1285
"smol_str",
1304
1286
"tikv-jemallocator",
1305
1287
"tokio",
+7
-3
Cargo.toml
+7
-3
Cargo.toml
···
1
+
cargo-features = ["codegen-backend"]
2
+
1
3
[package]
2
4
name = "sightline"
3
5
version = "0.1.0"
···
15
17
smol_str = { version = "0.3", features = ["serde"] }
16
18
scc = "2"
17
19
ahash = { version = "0.8", features = ["serde"] }
18
-
serde = { version = "1", features = ["derive"] }
19
-
serde_json = "1"
20
-
hypertext = { version = "0.12", features = ["axum", "htmx"] }
20
+
fun-html = { git = "https://github.com/90-008/fun-html.git", features = ["axum"] }
21
21
22
22
[target.'cfg(not(target_env = "msvc"))'.dependencies]
23
23
tikv-jemallocator = "0.6"
24
+
25
+
[profile.dev]
26
+
debug = 0
27
+
strip = "debuginfo"
+45
-2
src/main.rs
+45
-2
src/main.rs
···
1
-
fn main() {
2
-
println!("Hello, world!");
1
+
use std::{net::SocketAddr, sync::Arc};
2
+
3
+
use tracing::Level;
4
+
use tracing_subscriber::EnvFilter;
5
+
6
+
use crate::state::AppState;
7
+
8
+
pub mod router;
9
+
pub mod state;
10
+
pub mod templates;
11
+
12
+
#[tokio::main]
13
+
async fn main() {
14
+
tracing_subscriber::fmt::fmt()
15
+
.with_env_filter(
16
+
EnvFilter::builder()
17
+
.with_default_directive(Level::INFO.into())
18
+
.from_env_lossy(),
19
+
)
20
+
.compact()
21
+
.init();
22
+
23
+
let addr = SocketAddr::from((
24
+
[0, 0, 0, 0],
25
+
std::env::var("PORT")
26
+
.ok()
27
+
.and_then(|s| s.parse::<u16>().ok())
28
+
.unwrap_or(3713),
29
+
));
30
+
let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
31
+
32
+
let state = Arc::new(AppState::new());
33
+
let app = router::build(state);
34
+
35
+
tracing::info!("hi! serving on {addr}... (^_^)");
36
+
tokio::select! {
37
+
res = axum::serve(listener, app) => {
38
+
if let Err(e) = res {
39
+
tracing::error!("oops: serve failed: {e}! (@,@)");
40
+
}
41
+
}
42
+
_ = tokio::signal::ctrl_c() => {
43
+
tracing::info!("received ctrl-c! bye bye... (T.T)/");
44
+
}
45
+
}
3
46
}
+13
src/router/index.rs
+13
src/router/index.rs
···
1
+
use std::sync::Arc;
2
+
3
+
use axum::{
4
+
extract::State,
5
+
response::{Html, IntoResponse},
6
+
};
7
+
use fun_html::elt::text;
8
+
9
+
use crate::{state::AppState, templates::document};
10
+
11
+
pub async fn handle(state: State<Arc<AppState>>) -> impl IntoResponse {
12
+
Html(document::tmpl(text("meow")))
13
+
}
+13
src/router/mod.rs
+13
src/router/mod.rs
+11
src/state.rs
+11
src/state.rs
+23
src/templates/document.rs
+23
src/templates/document.rs
···
1
+
use fun_html::{Document, Element, attr::*, conv::*, html};
2
+
3
+
const HTMX_SRC: &str = "https://unpkg.com/htmx.org@2";
4
+
const MATCHA_SRC: &str = "https://matcha.mizu.sh/matcha.lite.css";
5
+
6
+
pub fn tmpl(children: Element) -> Document {
7
+
html(
8
+
[lang("en")],
9
+
[
10
+
head([
11
+
title("sightline"),
12
+
meta(charset_utf8()),
13
+
meta([
14
+
name("viewport"),
15
+
content("width=device-width, initial-scale=1.0"),
16
+
]),
17
+
script(HTMX_SRC),
18
+
link_stylesheet(MATCHA_SRC),
19
+
]),
20
+
body(children),
21
+
],
22
+
)
23
+
}
+1
src/templates/mod.rs
+1
src/templates/mod.rs
···
1
+
pub mod document;