Compare commits
2 Commits
7dc2d5350b
...
1667e14d64
Author | SHA1 | Date |
---|---|---|
Mossfet | 1667e14d64 | |
Mossfet | c2fe292b2d |
|
@ -1 +1,2 @@
|
|||
/target
|
||||
names.json
|
||||
|
|
|
@ -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,16 @@ extern crate rocket;
|
|||
mod assets;
|
||||
mod links;
|
||||
mod routes;
|
||||
mod names;
|
||||
|
||||
use names::Site;
|
||||
|
||||
#[launch]
|
||||
fn rocket() -> _ {
|
||||
let names_file = std::fs::File::open("names.json").unwrap();
|
||||
let names = names::load_names(names_file).unwrap();
|
||||
rocket::build()
|
||||
.manage(names)
|
||||
.mount(
|
||||
"/",
|
||||
routes![routes::index, routes::previous, routes::next, routes::name],
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
use std::fs::File;
|
||||
use std::io::{BufReader, Read};
|
||||
use serde_json::{Map, Value};
|
||||
|
||||
#[derive(Debug)]
|
||||
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 output: Vec<Site> = vec![];
|
||||
let mut contents = String::new();
|
||||
match buf_reader.read_to_string(&mut contents) {
|
||||
Ok(_) => {},
|
||||
Err(_) => {return Err(NamesError::FileAccessError)},
|
||||
}
|
||||
|
||||
println!("{}", contents);
|
||||
|
||||
match serde_json::from_str(&contents) {
|
||||
Ok(Value::Array(sites_array)) => {
|
||||
for i in sites_array {
|
||||
match i {
|
||||
Value::Object(site) => {
|
||||
let url = site.get("url");
|
||||
let name = site.get("name");
|
||||
match (url, name) {
|
||||
(Some(Value::String(url)), Some(Value::String(name))) => {
|
||||
output.push(Site::new(url, Some(name)));
|
||||
},
|
||||
(Some(Value::String(url)), None) => {
|
||||
output.push(Site::new(url, None));
|
||||
},
|
||||
_ => {return Err(NamesError::ParseError)},
|
||||
};
|
||||
}
|
||||
_ => {return Err(NamesError::ParseError)}
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {return Err(NamesError::ParseError)}
|
||||
}
|
||||
Ok(output)
|
||||
}
|
||||
|
||||
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