Basic static site serving

main
~erin 2023-07-25 23:42:15 -04:00
parent 94056699d2
commit afcdffd9ee
Signed by: erin
GPG Key ID: 0FEDEAFF1C14847E
5 changed files with 200 additions and 8 deletions

141
Cargo.lock generated
View File

@ -98,6 +98,12 @@ dependencies = [
"libc",
]
[[package]]
name = "arrayvec"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
[[package]]
name = "async-compression"
version = "0.4.1"
@ -215,6 +221,19 @@ dependencies = [
"rustc-demangle",
]
[[package]]
name = "bae"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33b8de67cc41132507eeece2584804efcb15f85ba516e34c944b7667f480397a"
dependencies = [
"heck 0.3.3",
"proc-macro-error",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "base64"
version = "0.13.1"
@ -233,6 +252,12 @@ version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
[[package]]
name = "beef"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1"
[[package]]
name = "bincode"
version = "1.3.3"
@ -730,6 +755,7 @@ dependencies = [
"chrono",
"config",
"dirs",
"ramhorns",
"tokio",
"tracing",
"tracing-subscriber",
@ -947,6 +973,15 @@ dependencies = [
"hashbrown 0.14.0",
]
[[package]]
name = "heck"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
dependencies = [
"unicode-segmentation",
]
[[package]]
name = "heck"
version = "0.4.1"
@ -1250,6 +1285,29 @@ version = "0.4.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
[[package]]
name = "logos"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf8b031682c67a8e3d5446840f9573eb7fe26efe7ec8d195c9ac4c0647c502f1"
dependencies = [
"logos-derive",
]
[[package]]
name = "logos-derive"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1d849148dbaf9661a6151d1ca82b13bb4c4c128146a88d05253b38d4e2f496c"
dependencies = [
"beef",
"fnv",
"proc-macro2",
"quote",
"regex-syntax 0.6.29",
"syn 1.0.109",
]
[[package]]
name = "mac"
version = "0.1.1"
@ -1727,6 +1785,30 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
[[package]]
name = "proc-macro-error"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
"proc-macro2",
"quote",
"syn 1.0.109",
"version_check",
]
[[package]]
name = "proc-macro-error-attr"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
"proc-macro2",
"quote",
"version_check",
]
[[package]]
name = "proc-macro2"
version = "1.0.66"
@ -1736,6 +1818,17 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "pulldown-cmark"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998"
dependencies = [
"bitflags 1.3.2",
"memchr",
"unicase",
]
[[package]]
name = "quote"
version = "1.0.32"
@ -1745,6 +1838,33 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "ramhorns"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47008ae2e2a9085a3f658203609d79f8a027829cf88a088d0c0084e18ba8f0b9"
dependencies = [
"arrayvec",
"beef",
"fnv",
"logos",
"pulldown-cmark",
"ramhorns-derive",
]
[[package]]
name = "ramhorns-derive"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ada9bbdd21adf426f932bf76b3db7d553538dffc16afd5fb8ce2ce2110a75536"
dependencies = [
"bae",
"fnv",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "rand"
version = "0.8.5"
@ -1823,7 +1943,7 @@ dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
"regex-syntax 0.7.4",
]
[[package]]
@ -1834,9 +1954,15 @@ checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
"regex-syntax 0.7.4",
]
[[package]]
name = "regex-syntax"
version = "0.6.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "regex-syntax"
version = "0.7.4"
@ -2333,7 +2459,7 @@ checksum = "8a4a8336d278c62231d87f24e8a7a74898156e34c1c18942857be2acb29c7dfc"
dependencies = [
"dotenvy",
"either",
"heck",
"heck 0.4.1",
"hex",
"once_cell",
"proc-macro2",
@ -2819,6 +2945,15 @@ version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
[[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.13"

View File

@ -15,3 +15,4 @@ axum.workspace = true
url.workspace = true
tracing.workspace = true
tracing-subscriber.workspace = true
ramhorns = "0.14.0"

View File

@ -1,19 +1,31 @@
use axum::{
body::Bytes,
extract::State,
http::StatusCode,
response::IntoResponse,
http::{header, HeaderMap, StatusCode},
response::{Html, IntoResponse},
routing::{get, post},
Json, Router,
};
use chrono::{DateTime, NaiveDateTime, Utc};
use ramhorns::{Content, Template};
use std::fs::File;
use std::io::prelude::*;
use std::net::SocketAddr;
use url::Url;
#[derive(Content)]
struct HomePage {
title: String,
description: String,
version: String,
}
#[tokio::main]
async fn main() {
tracing_subscriber::fmt::init();
let app = Router::new().route("/", get(root));
let app = Router::new()
.route("/", get(root))
.route("/style.css", get(stylesheet));
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
tracing::debug!("listening on {}", addr);
@ -24,6 +36,27 @@ async fn main() {
.unwrap();
}
async fn root() -> &'static str {
"Hello, World!"
async fn stylesheet() -> impl IntoResponse {
let mut headers = HeaderMap::new();
headers.insert(header::CONTENT_TYPE, "text/css".parse().unwrap());
let mut file = File::open("static/style.css").unwrap();
let mut contents = String::new();
file.read_to_string(&mut contents).unwrap();
(headers, contents)
}
async fn root() -> Html<String> {
let mut source = File::open("static/home.html").unwrap();
let mut contents = String::new();
source.read_to_string(&mut contents).unwrap();
let tpl = Template::new(contents).unwrap();
let rendered = tpl.render(&HomePage {
title: "Ferret".to_string(),
description: "A small idependent search engine".to_string(),
version: "v0.2.0".to_string(),
});
Html(rendered)
}

20
static/home.html Normal file
View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/style.css">
<!-- preview metadata -->
<meta property="og:site_name" content="{{title}}"/>
<meta property="og:title" content="{{title}}x"/>
<meta name="description" content="{{description}}"/>
<meta property="og:description" content="{{description}}">
<title>{{title}}</title>
</head>
<body>
<h1>{{title}}</h1>
<pre>{{version}}</pre>
</body>
</html>

3
static/style.css Normal file
View File

@ -0,0 +1,3 @@
body{margin:40px
auto;max-width:650px;line-height:1.6;font-size:18px;color:#444;padding:0
10px}h1,h2,h3{line-height:1.2}