Compare commits

...

2 Commits

Author SHA1 Message Date
Mossfet 1667e14d64 Initial json parsing 2023-06-30 17:47:25 +01:00
Mossfet c2fe292b2d Prepped code for names being defined at runtime in rocket() 2023-06-30 11:47:46 +01:00
7 changed files with 104 additions and 17 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
/target
names.json

1
Cargo.lock generated
View File

@ -663,6 +663,7 @@ dependencies = [
"askama_rocket",
"rocket",
"rust-embed",
"serde_json",
]
[[package]]

View File

@ -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"

View File

@ -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

View File

@ -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],

69
src/names.rs Normal file
View File

@ -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
}
}
}

View File

@ -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);