use crate::{links::{next_url, previous_url}, assets::ErrorTemplate}; use rocket::{ http::Status, response::Redirect, serde::{json::Json, Serialize}, State, }; use shared::names::Site; const NOT_FOUND_ERROR: ErrorTemplate = ErrorTemplate { error: "Not Found", error_description: "this URL could not be found on the webring.", }; #[derive(Serialize)] #[serde(crate = "rocket::serde")] pub struct JsonResponse { previous_site_name: Option, next_site_name: Option, } #[get("/")] pub fn index() -> &'static str { "Like, this is a webring, meow!" } #[get("/previous?")] 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, 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, 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); } Ok(Json(JsonResponse { previous_site_name, next_site_name, })) } #[catch(404)] pub fn not_found() -> ErrorTemplate<'static> { NOT_FOUND_ERROR }