Prepped code for names being defined at runtime in rocket()
This commit is contained in:
parent
7dc2d5350b
commit
c2fe292b2d
|
@ -663,6 +663,7 @@ dependencies = [
|
|||
"askama_rocket",
|
||||
"rocket",
|
||||
"rust-embed",
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
|
@ -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"
|
||||
|
|
20
src/links.rs
20
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<String> {
|
||||
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<Site>) -> Option<String> {
|
||||
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<String> {
|
||||
pub fn next_url(source_url: &String, names: &Vec<Site>) -> Option<String> {
|
||||
// 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
|
||||
|
|
|
@ -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],
|
||||
|
|
|
@ -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<Vec<Site>, 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<String>,
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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?<source_url>")]
|
||||
pub fn previous(source_url: String) -> Result<Redirect, Status> {
|
||||
match previous_url(&source_url) {
|
||||
pub fn previous(source_url: String, names: &State<Vec<Site>>) -> Result<Redirect, Status> {
|
||||
let names = names.inner();
|
||||
match previous_url(&source_url, names) {
|
||||
Some(url) => Ok(Redirect::to(format!("https://{}", url))),
|
||||
None => Err(Status::NotFound),
|
||||
}
|
||||
}
|
||||
|
||||
#[get("/next?<source_url>")]
|
||||
pub fn next(source_url: String) -> Result<Redirect, Status> {
|
||||
match next_url(&source_url) {
|
||||
pub fn next(source_url: String, names: &State<Vec<Site>>) -> Result<Redirect, Status> {
|
||||
let names = names.inner();
|
||||
match next_url(&source_url, names) {
|
||||
Some(url) => Ok(Redirect::to(format!("https://{}", url))),
|
||||
None => Err(Status::NotFound),
|
||||
}
|
||||
}
|
||||
|
||||
#[get("/name?<source_url>")]
|
||||
pub fn name(source_url: String) -> Result<Json<JsonResponse>, 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<Vec<Site>>) -> Result<Json<JsonResponse>, 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);
|
||||
|
|
Loading…
Reference in New Issue