From c481999c55fde15935ffec6c6c90ab273a74dd6e Mon Sep 17 00:00:00 2001 From: Fries Date: Fri, 30 Jun 2023 21:43:18 -0700 Subject: [PATCH] add a work in progress cli and fix bugs i'm making a cli that lets you add stuff to the names.json file and read data from it and i moved stuff that can be shared between them like the Site struct to a shared crate thats in workspace, like the cli crate. i also switched to using typed json parsing which works well. --- Cargo.lock | 134 +++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 13 ++++- cli/Cargo.toml | 19 ++++++ cli/src/arguments.rs | 30 ++++++++++ cli/src/commands.rs | 18 ++++++ cli/src/main.rs | 14 +++++ shared/Cargo.toml | 11 ++++ shared/src/lib.rs | 1 + shared/src/names.rs | 20 +++++++ src/links.rs | 14 ++--- src/main.rs | 6 +- src/names.rs | 83 ++++++--------------------- src/routes.rs | 3 +- 13 files changed, 288 insertions(+), 78 deletions(-) create mode 100644 cli/Cargo.toml create mode 100644 cli/src/arguments.rs create mode 100644 cli/src/commands.rs create mode 100644 cli/src/main.rs create mode 100644 shared/Cargo.toml create mode 100644 shared/src/lib.rs create mode 100644 shared/src/names.rs diff --git a/Cargo.lock b/Cargo.lock index 449c625..e7b8a18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,55 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" + +[[package]] +name = "anstyle-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys", +] + [[package]] name = "askama" version = "0.12.0" @@ -172,6 +221,63 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "clap" +version = "4.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384e169cc618c613d5e3ca6404dda77a8685a63e08660dcc64abaf7da7cb0c7a" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef137bbe35aab78bdb468ccfba75a5f4d8321ae011d34063770780545176af2d" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" + +[[package]] +name = "cli" +version = "0.1.0" +dependencies = [ + "clap", + "serde", + "serde_json", + "shared", +] + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "cookie" version = "0.17.0" @@ -439,6 +545,12 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.2.6" @@ -663,7 +775,9 @@ dependencies = [ "askama_rocket", "rocket", "rust-embed", + "serde", "serde_json", + "shared", ] [[package]] @@ -1207,6 +1321,14 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shared" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -1265,6 +1387,12 @@ dependencies = [ "loom", ] +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "syn" version = "2.0.22" @@ -1534,6 +1662,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "valuable" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 72a25cd..005d5e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,6 @@ +[workspace] +members = ["cli", "shared"] + [package] name = "meowy-webring" version = "0.1.0" @@ -11,9 +14,12 @@ default_features = false features = ["json"] [dependencies.rust-embed] -version = "6.7.0" +version = "6" features = ["debug-embed"] +[dependencies.serde] +version = "1.0" + [dependencies.serde_json] version = "1.0" @@ -27,5 +33,8 @@ git = "https://github.com/djc/askama.git" package = "askama" rev = "b9e51601560398766eac445517fb17c35090a952" version = "0.12" -default-features = true +default-features = true features = ["with-rocket", "mime", "mime_guess"] + +[dependencies.shared] +path = "./shared" diff --git a/cli/Cargo.toml b/cli/Cargo.toml new file mode 100644 index 0000000..a79600c --- /dev/null +++ b/cli/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "cli" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde = "1.0" +serde_json = "1.0" + +[dependencies.clap] +version = "4" +features = ["derive"] + +[dependencies.shared] +path = "../shared" + +[[bin]] +name = "meowy-cli" +path = "src/main.rs" diff --git a/cli/src/arguments.rs b/cli/src/arguments.rs new file mode 100644 index 0000000..7db619e --- /dev/null +++ b/cli/src/arguments.rs @@ -0,0 +1,30 @@ +use clap::{Parser, command, Subcommand, arg, Args}; + +#[derive(Parser, Debug)] +#[command(author, version, about, long_about = None)] +pub(crate) struct Arguments { + #[command(subcommand)] + pub(crate) command: Commands +} + + +#[derive(Subcommand, Debug)] +pub(crate) enum Commands { + #[command(about = "print the current webring sites and their names")] + Print { + #[arg(help = "the path to the names.json file")] + path: String, + #[command(flatten)] + group: Group + } + +} + +#[derive(Args, Debug)] +#[group(required = false)] +pub struct Group { + #[arg(long, short, action = clap::ArgAction::SetTrue, conflicts_with = "name", help = "print the url only")] + pub(crate) url: bool, + #[arg(long, short, action = clap::ArgAction::SetTrue, conflicts_with = "url", help = "print the name only")] + pub(crate) name: bool +} diff --git a/cli/src/commands.rs b/cli/src/commands.rs new file mode 100644 index 0000000..e5d80ee --- /dev/null +++ b/cli/src/commands.rs @@ -0,0 +1,18 @@ +use crate::arguments::Group; + +pub(crate) fn print(path: &String, group: &Group) { + let names = std::fs::read_to_string(path).unwrap(); + let parsed_names = shared::names::load_names(names).unwrap(); + + for site in parsed_names { + if group.name { + println!("{}", site.name.unwrap_or_default()); + continue; + } + if group.url { + println!("{}", site.url); + continue; + } + println!("{:?}", site); + } +} diff --git a/cli/src/main.rs b/cli/src/main.rs new file mode 100644 index 0000000..482b758 --- /dev/null +++ b/cli/src/main.rs @@ -0,0 +1,14 @@ +use arguments::{Arguments, Commands}; +use clap::Parser; +use commands::print; + +mod arguments; +mod commands; + +fn main() { + let args = Arguments::parse(); + + match &args.command { + Commands::Print { path, group } => print(path, group) + } +} diff --git a/shared/Cargo.toml b/shared/Cargo.toml new file mode 100644 index 0000000..aa08613 --- /dev/null +++ b/shared/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "shared" +version = "0.1.0" +edition = "2021" + +[dependencies] +serde_json = "1.0" + +[dependencies.serde] +version = "1.0" +features = ["derive"] diff --git a/shared/src/lib.rs b/shared/src/lib.rs new file mode 100644 index 0000000..d2f54b1 --- /dev/null +++ b/shared/src/lib.rs @@ -0,0 +1 @@ +pub mod names; diff --git a/shared/src/names.rs b/shared/src/names.rs new file mode 100644 index 0000000..112862e --- /dev/null +++ b/shared/src/names.rs @@ -0,0 +1,20 @@ +use serde::Deserialize; + +#[derive(Deserialize, Debug)] +pub struct Site { + pub url: String, + pub name: Option, +} + +#[derive(Debug)] +pub enum NamesError { + FileAccessError, + ParseError, +} + +pub fn load_names(names: String) -> Result, NamesError> { + match serde_json::from_str::>(&names) { + Ok(content) => Ok(content), + Err(_) => Err(NamesError::ParseError) + } +} diff --git a/src/links.rs b/src/links.rs index d4e6a05..fb742a3 100644 --- a/src/links.rs +++ b/src/links.rs @@ -1,18 +1,18 @@ -use crate::names::Site; +use shared::names::Site; 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()), + 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, names: &Vec) -> Option { // this is gay - 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()), + 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, } } diff --git a/src/main.rs b/src/main.rs index 5d9e7c9..2647299 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,12 +6,10 @@ 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(); + let names_file = std::fs::read_to_string("names.json").unwrap(); + let names = shared::names::load_names(names_file).unwrap(); rocket::build() .manage(names) .mount( diff --git a/src/names.rs b/src/names.rs index fbc39b4..ab58c1c 100644 --- a/src/names.rs +++ b/src/names.rs @@ -1,69 +1,24 @@ +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value}; 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, NamesError> { - let mut buf_reader = BufReader::new(names_file); - let mut output: Vec = 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, -} - -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 - } - } -} +// 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 e0eab00..7b600cb 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -1,4 +1,4 @@ -use crate::{links::{next_url, previous_url}, assets::ErrorTemplate, names::Site}; +use crate::{links::{next_url, previous_url}, assets::ErrorTemplate}; static NAMES: [&str; 3] = ["mossfet.xyz", "fries.gay", "ta-kev.digital"]; use rocket::{ @@ -7,6 +7,7 @@ use rocket::{ serde::{json::Json, Serialize}, State, }; +use shared::names::Site; const NOT_FOUND_ERROR: ErrorTemplate = ErrorTemplate { error: "Not Found",