From cc0b2319893ccfe4e0c97aca8004a30ceddaf7f4 Mon Sep 17 00:00:00 2001 From: Thumus Date: Tue, 4 Jun 2024 23:48:24 +0200 Subject: [PATCH] revert(json): remove json because it was really bad --- src/commands.rs | 4 -- src/commands/bulk_delete.rs | 24 +++------ src/commands/create.rs | 13 +++-- src/commands/install.rs | 12 ++--- src/commands/link.rs | 16 ++---- src/commands/package_path.rs | 13 ++--- src/commands/tree.rs | 48 +++--------------- src/commands/unlink.rs | 15 ++---- src/main.rs | 35 ++++---------- src/portable.rs | 5 +- src/utils/state.rs | 91 ----------------------------------- tapes/mkdir.gif | Bin 25896 -> 0 bytes tapes/mkdir.tape | 19 -------- 13 files changed, 49 insertions(+), 246 deletions(-) delete mode 100644 tapes/mkdir.gif delete mode 100644 tapes/mkdir.tape diff --git a/src/commands.rs b/src/commands.rs index 24e796b..8df8d86 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -170,8 +170,4 @@ pub enum Commands { pub struct Cli { #[command(subcommand)] pub command: Commands, - - /// Output everything into a json format. Available on every commands. - #[arg(short = 'j', long, global = true)] - pub json: bool, } diff --git a/src/commands/bulk_delete.rs b/src/commands/bulk_delete.rs index 2f38316..3578b83 100644 --- a/src/commands/bulk_delete.rs +++ b/src/commands/bulk_delete.rs @@ -1,10 +1,8 @@ -use serde_json::json; - -use crate::utils::state::{Error, ResponseKind::*, Responses, Result}; +use crate::utils::state::{Error, Result}; use super::{unlink, BulkDeleteArgs, UnlinkArgs}; -pub fn run(cmd: &BulkDeleteArgs, res: &mut Responses) -> Result { +pub fn run(cmd: &BulkDeleteArgs) -> Result { let mut vec: Vec = Vec::new(); for name in &cmd.names { let name_and_version = name @@ -22,23 +20,17 @@ pub fn run(cmd: &BulkDeleteArgs, res: &mut Responses) -> Result { None }, }; - match unlink::run(&ulnk, res) { + match unlink::run(&ulnk) { Ok(_) => (), Err(err) => { vec.push(err); } }; } - res.pushs(vec![ - Value(json!({ - "success": cmd.names.len() - vec.len(), - "failed": vec.len(), - })), - Message(format!( - "{}/{} successful", - cmd.names.len() - vec.len(), - cmd.names.len() - )), - ]); + println!( + "{}/{} successful", + cmd.names.len() - vec.len(), + cmd.names.len() + ); Ok(true) } diff --git a/src/commands/create.rs b/src/commands/create.rs index 3440425..0fea3ee 100644 --- a/src/commands/create.rs +++ b/src/commands/create.rs @@ -10,12 +10,12 @@ use semver::Version; use crate::utils::{ paths::{check_path_file, get_current_dir}, specs::{Extra, Package, TypstConfig}, - state::{ResponseKind::*, Responses, Result}, + state::Result, }; use super::CreateArgs; -pub fn run(cmd: &mut CreateArgs, res: &mut Responses) -> Result { +pub fn run(cmd: &mut CreateArgs) -> Result { let curr = get_current_dir()?; let typ = curr.clone() + "/typst.toml"; @@ -41,16 +41,15 @@ pub fn run(cmd: &mut CreateArgs, res: &mut Responses) -> Result { //let mut tmpl: Template = Template::new(cmd.template, entrypoint, thumbnail) if check_path_file(&typ) && !cmd.force { - res.push(Message("Nothing to do".into())); return Ok(false); } if cmd.force { - res.push(Message(format!( + println!( "{} {}", "WARNING:".bold().yellow(), "--force is a dangerous flag, use it cautiously".bold() - ))); + ); } if !cmd.cli { @@ -221,9 +220,9 @@ pub fn run(cmd: &mut CreateArgs, res: &mut Responses) -> Result { } TypstConfig::new(pkg, Some(extra), None).write(&typ); //todo: add template // typst.toml - res.push(Message(format!( + println!( "{}", "File created to {typ}".bold().to_string() - ))); + ); Ok(true) } diff --git a/src/commands/install.rs b/src/commands/install.rs index 0bce485..9e091df 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -8,7 +8,7 @@ use crate::{ get_ssh_dir, }, specs::{Extra, TypstConfig}, - state::{Error, ErrorKind, Responses, Result}, + state::{Error, ErrorKind, Result}, }, }; use git2::{build::RepoBuilder, Cred, FetchOptions, RemoteCallbacks, Repository}; @@ -16,16 +16,16 @@ use owo_colors::OwoColorize; use super::{link, InstallArgs}; -pub fn run(cmd: &InstallArgs, res: &mut Responses) -> Result { +pub fn run(cmd: &InstallArgs) -> Result { let path = format!("{}/tmp", datalocalutpm()); if check_path_dir(&path) { fs::remove_dir_all(path)?; } - init(cmd, res, 0)?; + init(cmd, 0)?; Ok(true) } -pub fn init(cmd: &InstallArgs, res: &mut Responses, i: usize) -> Result { +pub fn init(cmd: &InstallArgs, i: usize) -> Result { let path = if cmd.url.is_none() { get_current_dir()? } else { @@ -106,7 +106,7 @@ pub fn init(cmd: &InstallArgs, res: &mut Responses, i: usize) -> Result { force: cmd.force, url: Some(a.to_string()), }; - init(&ins, res, i * vec_depend.len() + y)?; + init(&ins, i * vec_depend.len() + y)?; Ok(true) }) .collect::>>(); @@ -123,7 +123,7 @@ pub fn init(cmd: &InstallArgs, res: &mut Responses, i: usize) -> Result { no_copy: false, }; - link::run(&lnk, Some(path.clone()), res)?; //TODO: change here too + link::run(&lnk, Some(path.clone()))?; //TODO: change here too fs::remove_dir_all(&path)?; println!( "{}", diff --git a/src/commands/link.rs b/src/commands/link.rs index 248511d..c4d0164 100644 --- a/src/commands/link.rs +++ b/src/commands/link.rs @@ -1,17 +1,16 @@ use owo_colors::OwoColorize; -use serde_json::json; use std::fs; use crate::utils::{ copy_dir_all, paths::{check_path_dir, d_packages, get_current_dir}, - state::{Error, ErrorKind, ResponseKind::*, Responses, Result}, + state::{Error, ErrorKind, Result}, symlink_all, specs::{Extra, TypstConfig}, }; use super::LinkArgs; -pub fn run(cmd: &LinkArgs, path: Option, res: &mut Responses) -> Result { +pub fn run(cmd: &LinkArgs, path: Option) -> Result { let curr = path.unwrap_or(get_current_dir()?); let config = TypstConfig::load(&(curr.clone() + "/typst.toml")); @@ -42,22 +41,17 @@ pub fn run(cmd: &LinkArgs, path: Option, res: &mut Responses) -> Result< if cmd.no_copy { symlink_all(&curr, &path)?; - let s = format!( + println!( "Project linked to: {} \nTry importing with:\n #import \"@{}/{}:{}\": *", path, namespace, name, version ); - res.push(Value(json!({ - "message": s, - }))); + } else { copy_dir_all(&curr, &path)?; - let s = format!( + println!( "Project copied to: {} \nTry importing with:\n #import \"@{}/{}:{}\": *", path, namespace, name, version ); - res.push(Value(json!({ - "message": s, - }))); } Ok(true) } diff --git a/src/commands/package_path.rs b/src/commands/package_path.rs index d597efb..bf054f2 100644 --- a/src/commands/package_path.rs +++ b/src/commands/package_path.rs @@ -1,16 +1,9 @@ -use serde_json::json; - use crate::utils::{ paths::d_packages, - state::{ResponseKind::*, Responses, Result}, + state::Result, }; -pub fn run(res: &mut Responses) -> Result { - res.pushs(vec![ - Value(json!({ - "path": d_packages(), - })), - Message(format!("Packages are located at: '{}'", d_packages())), - ]); +pub fn run() -> Result { + println!("Packages are located at: '{}'", d_packages()); Ok(true) } diff --git a/src/commands/tree.rs b/src/commands/tree.rs index a68dfaa..57de4ee 100644 --- a/src/commands/tree.rs +++ b/src/commands/tree.rs @@ -1,65 +1,31 @@ use owo_colors::OwoColorize; -use serde_json::{json, Map, Value}; use std::fs; use crate::utils::{ paths::d_packages, - state::{ResponseKind::*, Responses, Result}, + state::Result, }; -pub fn run(res: &mut Responses) -> Result { +pub fn run() -> Result { let typ = d_packages(); - if !res.json { - println!("{}", "Tree listing of your packages\n".bold()) - }; + println!("{}", "Tree listing of your packages\n".bold()); let dirs = fs::read_dir(&typ)?; - let mut data: Vec = vec![]; - for dir_res in dirs { let dir = dir_res?; - if !res.json { - println!("@{}:", dir.file_name().to_str().unwrap().green().bold()); - } + println!("@{}:", dir.file_name().to_str().unwrap().green().bold()); let subupdirs = fs::read_dir(dir.path())?; - let mut map = Map::new(); - let mut list: Vec = vec![]; - for dir_res in subupdirs { let dir = dir_res?; - if !res.json { - println!(" {}:", dir.file_name().to_str().unwrap().green().bold()); - } + println!(" {}:", dir.file_name().to_str().unwrap().green().bold()); let subdirs = fs::read_dir(dir.path())?; - - let mut map2 = Map::new(); - let mut list2: Vec = vec![]; - for sub_dir_res in subdirs { let subdir = sub_dir_res?; - list2.push(json!(subdir.file_name().to_str())); - if !res.json { - println!(" - {}", subdir.file_name().to_str().unwrap().green()); - } + println!(" - {}", subdir.file_name().to_str().unwrap().green()); } - - let array2 = Value::Array(list2); - map2.insert(dir.file_name().to_str().unwrap().into(), array2); - let dir_dataa: Value = Value::Object(map2); - - list.push(dir_dataa) } - let array = Value::Array(list); - map.insert(dir.file_name().to_str().unwrap().into(), array); - let dir_data: Value = Value::Object(map); - - data.push(dir_data); - } - // TODO: It's working for now but it will be changed one day - if res.json { - res.push(Value(json!(data))) - }; + } Ok(true) } diff --git a/src/commands/unlink.rs b/src/commands/unlink.rs index 7f16bb4..7df35cb 100644 --- a/src/commands/unlink.rs +++ b/src/commands/unlink.rs @@ -4,12 +4,12 @@ use std::fs; use crate::utils::{ paths::d_packages, - state::{Error, ErrorKind, ResponseKind::*, Responses, Result}, + state::{Error, ErrorKind, Result}, }; use super::UnlinkArgs; -pub fn run(cmd: &UnlinkArgs, res: &mut Responses) -> Result { +pub fn run(cmd: &UnlinkArgs) -> Result { let mut new_namespace = String::from("local"); if let Some(nspace) = &cmd.namespace { new_namespace = nspace.to_owned(); @@ -35,7 +35,6 @@ pub fn run(cmd: &UnlinkArgs, res: &mut Responses) -> Result { let bool = ans?; if !bool { - res.push(Message("Nothing to do".into())); return Ok(false); } @@ -62,8 +61,6 @@ pub fn run(cmd: &UnlinkArgs, res: &mut Responses) -> Result { let bool = ans?; if !bool { - res.push(Message("Nothing to do".into())); - return Ok(false); } @@ -79,18 +76,12 @@ pub fn run(cmd: &UnlinkArgs, res: &mut Responses) -> Result { let bool = ans?; if !bool { - res.push(Message("Nothing to do".into())); - return Ok(false); } fs::remove_dir_all(d_packages() + format!("/{}/{}", new_namespace, nm).as_str())?; } - if res.json { - res.push(Message(format!("{}", "Removed!".bold()))); - } else { - println!("{}", "Removed!".bold()) - } + println!("{}", "Removed!".bold()); Ok(true) } diff --git a/src/main.rs b/src/main.rs index 170d0ed..c76bfdc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,33 +6,18 @@ use commands::{ bulk_delete, create, install, link, tree, package_path, unlink, Cli, Commands, }; -use utils::state::{Error, Responses}; +use utils::state::Error; fn main() { let x = Cli::parse(); - let json = x.json; - let mut res = Responses::new(json); - let result: Result = match &x.command { - Commands::Create(cmd) => create::run(&mut cmd.clone(), &mut res), - Commands::Link(cmd) => link::run(cmd, None, &mut res), - Commands::Tree => tree::run(&mut res), - Commands::PackagesPath => package_path::run(&mut res), - Commands::Unlink(cmd) => unlink::run(cmd, &mut res), - Commands::BulkDelete(cmd) => bulk_delete::run(cmd, &mut res), - Commands::Install(cmd) => install::run(cmd, &mut res), + + let _: Result = match &x.command { + Commands::Create(cmd) => create::run(&mut cmd.clone()), + Commands::Link(cmd) => link::run(cmd, None), + Commands::Tree => tree::run(), + Commands::PackagesPath => package_path::run(), + Commands::Unlink(cmd) => unlink::run(cmd), + Commands::BulkDelete(cmd) => bulk_delete::run(cmd), + Commands::Install(cmd) => install::run(cmd), }; - match result { - Ok(_) => { - if json { - print!("{}", res.to_json()) - } - } - Err(val) => { - if json { - eprint!("{}", val.json()) - } else { - eprint!("{}", val.to_str()) - } - } - } } diff --git a/src/portable.rs b/src/portable.rs index 94bd48d..3c3c7ed 100644 --- a/src/portable.rs +++ b/src/portable.rs @@ -1,7 +1,6 @@ use std::env; use commands::InstallArgs; -use utils::state::Responses; #[allow(unused)] mod commands; @@ -13,10 +12,8 @@ mod utils; fn main() { let args: Vec = env::args().collect(); let force = args.contains(&"--force".to_string()) || args.contains(&"-f".to_string()); - let json = args.contains(&"--json".to_string()) || args.contains(&"-j".to_string()); - let mut res = Responses::new(json); let install = InstallArgs { url: None, force }; - match commands::install::run(&install, &mut res) { + match commands::install::run(&install) { Err(err) => println!("{}", err.to_string()), Ok(_) => println!("Everything is good to go!"), } diff --git a/src/utils/state.rs b/src/utils/state.rs index 8feaecd..72e56c6 100644 --- a/src/utils/state.rs +++ b/src/utils/state.rs @@ -1,6 +1,5 @@ use owo_colors::OwoColorize; use semver::Version; -use serde_json::{json, Value}; use std::{fmt, io::Error as IError}; /// All errors implemented in utpm @@ -22,84 +21,6 @@ pub enum ErrorKind { SemVer, } -/// Types -#[derive(Debug)] -pub enum ResponseKind { - Message(String), - Value(Value), -} - -pub struct Responses { - messages: Vec, - pub json: bool, -} - -impl Responses { - pub fn new(json: bool) -> Self { - Self { - messages: vec![], - json, - } - } - - pub fn pushs(&mut self, vals: Vec) { - for e in vals { - self.push(e); - } - } - - pub fn push(&mut self, val: ResponseKind) { - if self.json { - self.messages.push(val); - } else { - match val { - ResponseKind::Message(string) => println!("{}", string), - ResponseKind::Value(val) => println!("{}", val.to_string()), - } - } - } - - pub fn to_str(&self) -> String { - let mut string: String = "".into(); - for message in &self.messages { - match message { - ResponseKind::Message(str) => string = format!("{}{}\n", string, str), - ResponseKind::Value(_) => todo!(), - }; - } - string - } - - pub fn to_json(&self) -> Value { - serde_json::from_str( - serde_json::to_string( - &self - .messages - .iter() - .map(|a| match a { - ResponseKind::Message(str) => { - println!( - "{:?}", - str.split(" ") - .map(|a| a.to_string() + " ") - .collect::() - ); - json!({ "message": str }) - } - ResponseKind::Value(val) => val.clone(), - }) - .collect::(), - ) - .unwrap() - .as_str(), - ) - .unwrap() - } - - pub fn display(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", self.to_str()) - } -} impl ErrorKind { pub fn message(&self) -> String { @@ -146,13 +67,6 @@ impl Error { message: None, } } - pub fn json(&self) -> Value { - let message = self.message.clone().unwrap_or(self.kind.message()); - json!({ - "type": self.kind.to_string(), - "message": message, - }) - } pub fn to_str(&self) -> String { let kind_message = format!("{} Error", self.kind.to_string()); if let Some(message) = &self.message { @@ -173,11 +87,6 @@ impl fmt::Display for Error { } } -impl fmt::Display for Responses { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - self.display(f) - } -} //TODO: impl errors. diff --git a/tapes/mkdir.gif b/tapes/mkdir.gif deleted file mode 100644 index 27fb3385eb01dfdc964baa204d6c8b80ece309be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25896 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 diff --git a/tapes/mkdir.tape b/tapes/mkdir.tape deleted file mode 100644 index 27a37d4..0000000 --- a/tapes/mkdir.tape +++ /dev/null @@ -1,19 +0,0 @@ -Set Width 400 -Set Height 225 -Require utpm - -Output mkdir.gif - -Type@70ms "mkdir myPackage" - -Sleep 500ms - -Enter - -Type@70ms "cd myPackage" - -Sleep 500ms - -Enter - -Sleep 5s \ No newline at end of file