diff --git a/Cargo.lock b/Cargo.lock index 1d6a58a..449c625 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -663,6 +663,7 @@ dependencies = [ "askama_rocket", "rocket", "rust-embed", + "serde_json", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index a54a5aa..72a25cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,9 @@ features = ["json"] version = "6.7.0" features = ["debug-embed"] +[dependencies.serde_json] +version = "1.0" + [dependencies.askama_rocket] git = "https://github.com/djc/askama.git" package = "askama_rocket" diff --git a/src/links.rs b/src/links.rs index eab9c10..d4e6a05 100644 --- a/src/links.rs +++ b/src/links.rs @@ -1,18 +1,20 @@ -static NAMES: [&str; 3] = ["mossfet.xyz", "fries.gay", "ta-kev.digital"]; +use crate::names::Site; -pub fn previous_url(source_url: &String) -> Option { - match NAMES.iter().position(|&r| r == source_url) { - Some(index) if index == 0 => Some(NAMES[NAMES.len() - 1].to_string()), - Some(index) => Some(NAMES[index - 1].to_string()), +pub fn previous_url(source_url: &String, names: &Vec) -> Option { + match names.iter().position(|r| r.url() == source_url) { + Some(index) if index == 0 => Some(names[names.len() - 1].url().to_string()), + Some(index) => Some(names[index - 1].url().to_string()), None => None, } } -pub fn next_url(source_url: &String) -> Option { +pub fn next_url(source_url: &String, names: &Vec) -> Option { // this is gay - match NAMES.iter().position(|&r| r == source_url) { - Some(index) if index == NAMES.len() - 1 => Some(NAMES[0].to_string()), - Some(index) => Some(NAMES[index + 1].to_string()), + match names.iter().position(|r| r.url() == source_url) { + Some(index) if index == names.len() - 1 => Some(names[0].url().to_string()), + Some(index) => Some(names[index + 1].url().to_string()), None => None, } } + +// TODO: previous_name, next_name diff --git a/src/main.rs b/src/main.rs index 6cb7fda..7e7c302 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,10 +4,18 @@ extern crate rocket; mod assets; mod links; mod routes; +mod names; + +use names::Site; #[launch] fn rocket() -> _ { + let names = vec![ + Site::new("mossfet.xyz", Some("Mossy's site")), + Site::new("fries.gay", Some("Fries's site")) + ]; rocket::build() + .manage(names) .mount( "/", routes![routes::index, routes::previous, routes::next, routes::name], diff --git a/src/names.rs b/src/names.rs new file mode 100644 index 0000000..0ce6c83 --- /dev/null +++ b/src/names.rs @@ -0,0 +1,41 @@ +use std::fs::File; +use std::io::{BufReader, Read}; + +pub enum NamesError { + FileAccessError, + ParseError, +} + +pub fn load_names(names_file: File) -> Result, NamesError> { + let mut buf_reader = BufReader::new(names_file); + let mut contents = String::new(); + match buf_reader.read_to_string(&mut contents) { + Ok(_) => {}, + Err(_) => {return Err(NamesError::FileAccessError)}, + } + println!("{}", contents); + Err(NamesError::ParseError) +} + +pub struct Site { + url: String, + name: Option, +} + +impl Site { + pub fn new(url: &str, name: Option<&str>) -> Self { + Site { + url: url.to_string(), + name: name.map(str::to_string), + } + } + pub fn url(&self) -> &String { + &self.url + } + pub fn name(&self) -> Option<&String> { + match &self.name { + Some(name) => Some(&name), + None => None + } + } +} diff --git a/src/routes.rs b/src/routes.rs index d263734..e0eab00 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -1,8 +1,11 @@ -use crate::{links::{next_url, previous_url}, assets::ErrorTemplate}; +use crate::{links::{next_url, previous_url}, assets::ErrorTemplate, names::Site}; +static NAMES: [&str; 3] = ["mossfet.xyz", "fries.gay", "ta-kev.digital"]; + use rocket::{ http::Status, response::Redirect, serde::{json::Json, Serialize}, + State, }; const NOT_FOUND_ERROR: ErrorTemplate = ErrorTemplate { @@ -23,25 +26,27 @@ pub fn index() -> &'static str { } #[get("/previous?")] -pub fn previous(source_url: String) -> Result { - match previous_url(&source_url) { +pub fn previous(source_url: String, names: &State>) -> Result { + let names = names.inner(); + match previous_url(&source_url, names) { Some(url) => Ok(Redirect::to(format!("https://{}", url))), None => Err(Status::NotFound), } } #[get("/next?")] -pub fn next(source_url: String) -> Result { - match next_url(&source_url) { +pub fn next(source_url: String, names: &State>) -> Result { + let names = names.inner(); + match next_url(&source_url, names) { Some(url) => Ok(Redirect::to(format!("https://{}", url))), None => Err(Status::NotFound), } } #[get("/name?")] -pub fn name(source_url: String) -> Result, Status> { - let previous_site_name = previous_url(&source_url); - let next_site_name = next_url(&source_url); +pub fn name(source_url: String, names: &State>) -> Result, Status> { + let previous_site_name = previous_url(&source_url, names); + let next_site_name = next_url(&source_url, names); if previous_site_name.is_none() && next_site_name.is_none() { return Err(Status::NotFound);