summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorTyler Murphy <tylerm@tylerm.dev>2023-07-08 23:30:33 -0400
committerTyler Murphy <tylerm@tylerm.dev>2023-07-08 23:30:33 -0400
commitccf6bef34ceaae6e28dacdb18b6eebdf67ad5094 (patch)
tree106ea2345204a70bf6457e9ba8e1e33a1442cb5e /src/main.rs
downloadbucket-ccf6bef34ceaae6e28dacdb18b6eebdf67ad5094.tar.gz
bucket-ccf6bef34ceaae6e28dacdb18b6eebdf67ad5094.tar.bz2
bucket-ccf6bef34ceaae6e28dacdb18b6eebdf67ad5094.zip
bucket
Diffstat (limited to '')
-rw-r--r--src/main.rs68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..8ea0114
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,68 @@
+use std::{env, error::Error, collections::HashMap, process::exit, sync::Arc};
+use serde::Deserialize;
+use axum::{Router, Extension};
+use tera::Tera;
+
+mod routes;
+
+pub struct State {
+ pub templates: Tera,
+ pub pages: HashMap<String, (String, String)>
+}
+
+#[derive(Deserialize)]
+pub struct Page {
+ name: String,
+ url: String
+}
+
+async fn load_state() -> Result<State, Box<dyn Error>> {
+ let mut templates = Tera::new("public/templates/**")?;
+ templates.autoescape_on(vec![]);
+
+ let json = reqwest::get("https://raw.githubusercontent.com/bucketfish/bucket-webring/master/webring.json")
+ .await?
+ .json::<Vec<Page>>()
+ .await?;
+
+ let mut pages = HashMap::new();
+
+ for (i, page) in json.iter().enumerate() {
+ let prev = json[(i + json.len() - 1) % json.len()].url.clone();
+ let next = json[(i + json.len() + 1) % json.len()].url.clone();
+ pages.insert(page.name.clone(), (prev, next));
+ }
+
+ Ok(State{ templates, pages })
+}
+
+#[tokio::main]
+async fn main() {
+
+ let port: u16 = env::var("PORT")
+ .unwrap_or_else(|_| String::new())
+ .parse::<u16>()
+ .unwrap_or(8080);
+
+ let addr = format!("[::]:{port}")
+ .parse::<std::net::SocketAddr>()
+ .expect("Failed to create port binding");
+
+ let state = match load_state().await {
+ Ok(s) => s,
+ Err(e) => {
+ eprintln!("Parsing error: {e}");
+ exit(1);
+ }
+ };
+
+ let router = Router::new()
+ .fallback_service(routes::router())
+ .layer(Extension(Arc::new(state)));
+
+ axum::Server::bind(&addr)
+ .serve(router.into_make_service())
+ .await
+ .expect("Failed to launch web server");
+
+}