diff options
author | Tyler Murphy <tylerm@tylerm.dev> | 2023-07-08 23:30:33 -0400 |
---|---|---|
committer | Tyler Murphy <tylerm@tylerm.dev> | 2023-07-08 23:30:33 -0400 |
commit | ccf6bef34ceaae6e28dacdb18b6eebdf67ad5094 (patch) | |
tree | 106ea2345204a70bf6457e9ba8e1e33a1442cb5e /src/main.rs | |
download | bucket-ccf6bef34ceaae6e28dacdb18b6eebdf67ad5094.tar.gz bucket-ccf6bef34ceaae6e28dacdb18b6eebdf67ad5094.tar.bz2 bucket-ccf6bef34ceaae6e28dacdb18b6eebdf67ad5094.zip |
bucket
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 68 |
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"); + +} |