diff --git a/build.rs b/build.rs index 75b7eb1..367e3a5 100644 --- a/build.rs +++ b/build.rs @@ -47,7 +47,7 @@ fn vento() -> Result<(String, String)> { .description("List files and directories in the currently active inventory, the files in SLOT, the files in DIRECTORY or the files in DIRECTORY in SLOT.") .flag( Flag::new() - .short("-s") + .short("-c") .long("--switch") .help("Switches inventory slots"), ) @@ -63,7 +63,12 @@ fn vento() -> Result<(String, String)> { .long("--help") .help("Shows the help message"), ) - .arg(Arg::new("[SLOT]")) + .option( + Opt::new("slot") + .short("-s") + .long("--slot") + .help("The slot to list"), + ) .arg(Arg::new("[DIRECTORY]")) .custom( Section::new("before starting") diff --git a/src/bin/drop.rs b/src/bin/drop.rs new file mode 100644 index 0000000..44f7897 --- /dev/null +++ b/src/bin/drop.rs @@ -0,0 +1,66 @@ +/* + * Vento, a CLI inventory for your files. + * Copyright (C) 2022 Lux Aliaga + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +use anyhow::{bail, Result}; +use colored::Colorize; +use std::env; +use std::path::Path; +use vento::{help, item}; + +fn main() -> Result<()> { + let args: Vec = env::args().collect(); + if args.len() >= 2 { + if args[1].contains("--slot=") { + match args.len() { + 4 => item::drop(&args[2], &args[1].as_str().replace("--slot=", ""), Path::new(&args[4]).to_path_buf())?, + 3 => item::drop(&args[2], &args[1].as_str().replace("--slot=", ""), match env::current_dir() { + Ok(dir) => dir, + Err(_) => bail!("❌ {}", "Vento was unable to detect your current directory. Have you configured your environment correctly?".red()) + })?, + 2 => bail!("❌ {}", "You need to specify a file".red()), + _ => bail!("❌ {}", "Too many arguments".red()), + }; + } else { + match args[1].as_str() { + "--help" | "-h" => help::drop()?, + "-s" => match args.len() { + 5 => item::drop(&args[3], &args[2], Path::new(&args[4]).to_path_buf())?, + 4 => item::drop(&args[3], &args[2], match env::current_dir() { + Ok(dir) => dir, + Err(_) => bail!("❌ {}", "Vento was unable to detect your current directory. Have you configured your environment correctly?".red()) + })?, + 3 => bail!("❌ {}", "You need to specify a file".red()), + 2 => bail!("❌ {}", "You need to specify a slot".red()), + _ => bail!("❌ {}", "Too many arguments".red()), + }, + _ => match args.len() { + 3 => item::drop(&args[1], &String::from("active"), Path::new(&args[2]).to_path_buf())?, + 2 => item::drop(&args[1], &String::from("active"), match env::current_dir() { + Ok(dir) => dir, + Err(_) => bail!("❌ {}", "Vento was unable to detect your current directory. Have you configured your environment correctly?".red()) + })?, + _ => bail!("❌ {}", "Too many arguments".red()), + }, + } + } + } else { + help::drop()?; + } + Ok(()) +} diff --git a/src/bin/take.rs b/src/bin/take.rs new file mode 100644 index 0000000..0736bf8 --- /dev/null +++ b/src/bin/take.rs @@ -0,0 +1,53 @@ +/* + * Vento, a CLI inventory for your files. + * Copyright (C) 2022 Lux Aliaga + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +use anyhow::{bail, Result}; +use colored::Colorize; +use std::env; +use vento::{help, item}; + +fn main() -> Result<()> { + let args: Vec = env::args().collect(); + if args.len() >= 2 { + if args[1].contains("--slot=") { + match args.len() { + 3 => item::take(&args[2], &args[1].replace("--slot=", ""))?, + 2 => bail!("❌ {}", "You need to specify a file".red()), + _ => bail!("❌ {}", "Too many arguments".red()), + }; + } else { + match args[1].as_str() { + "--help" | "-h" => help::take()?, + "-s" => match args.len() { + 4 => item::take(&args[3], &args[2])?, + 3 => bail!("❌ {}", "You need to specify a file".red()), + 2 => bail!("❌ {}", "You need to specify a slot".red()), + _ => bail!("❌ {}", "Too many arguments".red()), + }, + _ => match args.len() { + 2 => item::take(&args[1], &String::from("active"))?, + _ => bail!("❌ {}", "Too many arguments".red()), + }, + } + } + } else { + help::take()?; + } + Ok(()) +} diff --git a/src/bin/vento.rs b/src/bin/vento.rs new file mode 100644 index 0000000..50d790f --- /dev/null +++ b/src/bin/vento.rs @@ -0,0 +1,54 @@ +/* + * Vento, a CLI inventory for your files. + * Copyright (C) 2022 Lux Aliaga + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +use anyhow::{bail, Result}; +use colored::Colorize; +use std::env; +use vento::{help, inv}; + +fn main() -> Result<()> { + let args: Vec = env::args().collect(); + if args.len() >= 2 { + // If the vector for the arguments the command is taking is larger than 2, it most likely means the user has provided an argument + if args[1].contains("--slot=") { + match args.len() { + 3 => inv::list(&args[1].replace("--slot=", ""), &args[2])?, + 2 => inv::list(&args[1].replace("--slot=", ""), "")?, + _ => bail!("❌ {}", "Too many arguments".red()), + }; + } else { + match args[1].as_str() { + "-h" | "--help" => help::vento()?, + "-i" | "--init" => inv::init()?, + "-c" | "--switch" => inv::switch()?, + "-s" => match args.len() { + 4 => inv::list(&args[2], &args[3])?, + 3 => inv::list(&args[2], "")?, + 2 => bail!("❌ {}", "You need to specify a slot.".red()), + _ => bail!("❌ {}", "Too many arguments".red()), + }, + _ => inv::list("active", args[1].as_str())?, + } + } + } else { + // If the user provides no commands, Vento will display the files in the active slot. + inv::list("active", "")?; + } + Ok(()) +} diff --git a/src/common.rs b/src/common.rs index e5735c5..6870a8d 100644 --- a/src/common.rs +++ b/src/common.rs @@ -29,7 +29,7 @@ pub fn env_config() -> Result> { _ => PathBuf::new(), }; if home == emptypath { - bail!("❌ {}", format!("Vento was unable to detect your home folder. Have you configured your environment correctly?").red()); + bail!("❌ {}", "Vento was unable to detect your home folder. Have you configured your environment correctly?".red()); }; let vento_dir = [home, Path::new(".vento").to_path_buf()].iter().collect(); let active_dir = [&vento_dir, &Path::new("active").to_path_buf()] diff --git a/src/help.rs b/src/help.rs new file mode 100644 index 0000000..83ce899 --- /dev/null +++ b/src/help.rs @@ -0,0 +1,82 @@ +/* + * Vento, a CLI inventory for your files. + * Copyright (C) 2022 Lux Aliaga + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +use anyhow::Result; +use colored::Colorize; + +pub fn vento() -> Result<()> { + // A quick guide to move around in Vento + println!( + "{}, a CLI inventory for your files +© 2022 Lux Aliaga. Licensed under GPLv3 + +{} + - {}: Lists files in selected inventory + - {}: Switches slots + - {}: Initializes Vento + - {}: Displays this message", + "Vento".bold().blue(), + "Usage:".bold(), + "vento [ -s slot | --slot=slot ] [ directory ]" + .bold() + .green(), + "vento ( -c | --switch )".bold().green(), + "vento ( -i | --init )".bold().green(), + "vento ( -h | --help )".bold().green() + ); + Ok(()) +} + +pub fn take() -> Result<()> { + // A quick guide to move around in Vento + println!( + "{}, a file grabber for Vento +© 2022 Lux Aliaga. Licensed under GPLv3 + +{} + - {}: Takes a file and saves it in the inventory + - {}: Displays this message", + "Take".bold().blue(), + "Usage:".bold(), + "take [ -s slot | --slot=slot ] file | directory" + .bold() + .green(), + "take ( -h | --help )".bold().green() + ); + Ok(()) +} + +pub fn drop() -> Result<()> { + // A quick guide to move around in Vento + println!( + "{}, a file dropper for Vento +© 2022 Lux Aliaga. Licensed under GPLv3 + +{} + - {}: Takes a file off the inventory and drops it. + - {}: Displays this message", + "Drop".bold().blue(), + "Usage:".bold(), + "drop [ -s slot | --slot=slot ] file | directory [destination]" + .bold() + .green(), + "drop ( -h | --help )".bold().green() + ); + Ok(()) +} diff --git a/src/inv.rs b/src/inv.rs index 4f24c8e..55f2c8f 100644 --- a/src/inv.rs +++ b/src/inv.rs @@ -32,11 +32,11 @@ pub fn init() -> Result<()> { if ventodir.is_dir() { // Checks if Vento has already been initialized and prompts the user if they want to initialize it again let mut answer = String::new(); - print!("⚠️ {} {}", format!("WARNING:").bold().red(), "Vento has already been initialized. Reinitializing will delete all files on the directory for Vento. Do you wish to proceed? (y/N) "); + print!("⚠️ {} {}", "WARNING:".bold().red(), "Vento has already been initialized. Reinitializing will delete all files on the directory for Vento. Do you wish to proceed? (y/N) "); let _ = io::stdout().flush(); io::stdin() .read_line(&mut answer) - .expect("❌ Failed to read input"); + .context("❌ Failed to read input")?; match answer.as_str().trim() { "y" | "Y" => fs::remove_dir_all(&ventodir)?, _ => process::exit(0), @@ -55,13 +55,21 @@ pub fn list(slot: &str, dir: &str) -> Result<()> { _ => PathBuf::new(), }; + let ventodir = &common::env_config()?[0]; + + if !ventodir.is_dir() { + bail!( + "❌ {}", + "Vento not initialized. Run \"vento -i\" to initialize Vento.".red() + ); + } + if dir != "" { slotdir = [&slotdir, &Path::new(dir).to_path_buf()].iter().collect(); } if dir.to_string().contains("..") { - bail!("❌ {}", format!("Cannot access parent.").red()); - // process::exit(1); + bail!("❌ {}", "Cannot access parent.".red()); } if slotdir.is_dir() { @@ -117,11 +125,11 @@ pub fn list(slot: &str, dir: &str) -> Result<()> { println!( " - [{}] {}{}", if file.clone().is_dir() { - format!("D").blue() + "D".blue() } else if file.clone().is_symlink() { - format!("S").yellow() + "S".yellow() } else { - format!("F").green() + "F".green() }, file.clone() .file_name() @@ -145,8 +153,8 @@ pub fn list(slot: &str, dir: &str) -> Result<()> { "❌ {}", format!( "No such slot or directory. Valid slots are {} and {}.", - format!("active").green().bold(), - format!("inactive").blue().bold() + "active".green().bold(), + "inactive".blue().bold() ) .red() ); @@ -163,14 +171,13 @@ pub fn switch() -> Result<()> { .iter() .collect(); - fs::rename(&active, &temp) - .expect("❌ Vento was unable to switch slots. Try running vento init and try again"); - fs::rename(&inactive, &active) - .expect("❌ Vento was unable to switch slots. Try running vento init and try again"); - fs::rename(&temp, &inactive) - .expect("❌ Vento was unable to switch slots. Try running vento init and try again"); + let rename_error = "❌ Vento was unable to switch slots. Try running vento init and try again"; - println!("🎉 {}", format!("Switched inventory slots!").green()); + fs::rename(&active, &temp).context(rename_error)?; + fs::rename(&inactive, &active).context(rename_error)?; + fs::rename(&temp, &inactive).context(rename_error)?; + + println!("🎉 {}", "Switched inventory slots!".green()); Ok(()) } @@ -179,13 +186,11 @@ fn create_slots() -> Result<()> { let active = &common::env_config()?[1]; let inactive = &common::env_config()?[2]; - fs::create_dir_all(active) - .context("❌ Vento was unable to initalize. Do you have the correct permissions?")?; - fs::create_dir_all(inactive) - .context("❌ Vento was unable to initalize. Do you have the correct permissions?")?; + let initialize_error = "❌ Vento was unable to initalize. Do you have the correct permissions"; - println!( - "🎉 {}", format!("Vento has been succesfully initialized!").green() - ); + fs::create_dir_all(active).context(initialize_error)?; + fs::create_dir_all(inactive).context(initialize_error)?; + + println!("🎉 {}", "Vento has been succesfully initialized!".green()); Ok(()) } diff --git a/src/item.rs b/src/item.rs index 11238f6..2f43e8b 100644 --- a/src/item.rs +++ b/src/item.rs @@ -24,35 +24,42 @@ use fs_extra::dir::{move_dir, CopyOptions}; use std::fs; use std::path::{Path, PathBuf}; -pub fn take(file: &String) -> Result<()> { +pub fn take(file: &String, slot: &String) -> Result<()> { // Takes a file or directory - let active = &common::env_config()?[1]; - + let slotdir: PathBuf = match slot.as_str() { + "active" | "a" => common::env_config()?[1].clone(), + "inactive" | "i" => common::env_config()?[2].clone(), + _ => PathBuf::new(), + }; let sourcepath: PathBuf = Path::new(&file).to_path_buf(); - let destpath: PathBuf = [&active, &Path::new(file).to_path_buf()].iter().collect(); + let destpath: PathBuf = [&slotdir, &Path::new(file).to_path_buf()].iter().collect(); if Path::exists(&destpath) { bail!( "❌ {}", - format!("A file with the same name already exists in your inventory!").red() + "A file with the same name already exists in your inventory!".red() ); } else if sourcepath.is_file() | sourcepath.is_symlink() { fs::copy(&file, &destpath).expect("❌ Vento was unable to copy the file."); fs::remove_file(&file).expect("❌ Vento was unable to remove the file."); } else if sourcepath.is_dir() { let options = CopyOptions::new(); - move_dir(&file, &active, &options).expect("❌ Vento was unable to move the directory."); + move_dir(&file, &slotdir, &options).expect("❌ Vento was unable to move the directory."); } else { - println!("❌ {}", format!("No such file or directory.").red()); + println!("❌ {}", "No such file or directory.".red()); } Ok(()) } -pub fn drop(file: &String, dest: PathBuf) -> Result<()> { +pub fn drop(file: &String, slot: &String, dest: PathBuf) -> Result<()> { // Drops a file or directory - let active = &common::env_config()?[1]; + let slotdir: PathBuf = match slot.as_str() { + "active" | "a" => common::env_config()?[1].clone(), + "inactive" | "i" => common::env_config()?[2].clone(), + _ => PathBuf::new(), + }; - let sourcepath: PathBuf = [&active, &Path::new(file).to_path_buf()].iter().collect(); + let sourcepath: PathBuf = [&slotdir, &Path::new(file).to_path_buf()].iter().collect(); let destpath: PathBuf = [ Path::new(&dest).to_path_buf(), Path::new(file).to_path_buf(), @@ -62,7 +69,7 @@ pub fn drop(file: &String, dest: PathBuf) -> Result<()> { if Path::exists(&destpath) { // HAHA YANDEREDEV MOMENT. This checks what method to use for the file/directory the user has picked - bail!("❌ {}", format!("A file with the same name already exists in the destination! Try renaming it or dropping this file somewhere else.").red()); + bail!("❌ {}", "A file with the same name already exists in the destination! Try renaming it or dropping this file somewhere else.".red()); } else if sourcepath.is_file() | sourcepath.is_symlink() { fs::copy(&sourcepath, &destpath).context("❌ Vento was unable to copy the file.")?; fs::remove_file(&sourcepath).context("❌ Vento was unable to remove the file.")?; @@ -72,7 +79,7 @@ pub fn drop(file: &String, dest: PathBuf) -> Result<()> { move_dir(&sourcepath, &destpath, &options) .expect("❌ Vento was unable to move the directory."); } else { - bail!("❌ {}", format!("No such file or directory.").red()); + bail!("❌ {}", "No such file or directory.".red()); } Ok(()) } diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..5729571 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,23 @@ +/* + * Vento, a CLI inventory for your files. + * Copyright (C) 2022 Lux Aliaga + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +mod common; +pub mod help; +pub mod inv; +pub mod item; diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 5bc08b8..0000000 --- a/src/main.rs +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Vento, a CLI inventory for your files. - * Copyright (C) 2022 Lux Aliaga - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -use anyhow::{bail, Result}; -use colored::Colorize; -use std::env; -use std::path::Path; -use std::process; - -mod common; -mod inv; -mod item; - -fn main() -> Result<()> { - let args: Vec = env::args().collect(); - if args.len() >= 2 { - // If the vector for the arguments the command is taking is larger than 2, it most likely means the user has provided an argument - match args[1].as_str() { - "help" | "h" => help()?, - "init" | "i" => inv::init()?, - "list" | "l" => match args.len() { - 4 => inv::list(args[2].as_str(), args[3].as_str())?, - 3 => match args[2].as_str() { - "active" | "a" | "inactive" | "i" => inv::list(args[2].as_str(), "")?, - _ => inv::list("active", args[2].as_str())?, - }, - 2 => inv::list("active", "")?, - _ => bail!("❌ {}", format!("Too many arguments.").red()), - }, - "switch" | "s" => inv::switch()?, - "take" | "t" => { - if args.len() == 3 { - // Similar thing with list, but change it with a file and it will show an error instead of defaulting to anything - item::take(&args[2])?; - } else { - bail!("❌ {}", format!("You need to specify a file.").red()) - }; - } - "drop" | "d" => { - if args.len() == 3 { - // Tries to get the current directory if the user hasn't provided a "landing location" - item::drop( - &args[2], - match env::current_dir() { - Ok(dir) => dir, - Err(_) => { - println!("❌ {}", format!("Vento was unable to detect your current directory. Have you configured your environment correctly?").red()); - process::exit(1); - } - }, - )?; - } else if args.len() == 4 { - item::drop(&args[2], Path::new(&args[3]).to_path_buf())?; - } else { - println!("❌ {}", format!("You need to specify a file.").red()) - }; - } - _ => { - println!("❔ Command not found. Type \"vento help\" to see all commands available.") - } - } - } else { - // If the user provides no commands, it'll fall back to the help guide - help()?; - } - Ok(()) -} - -fn help() -> Result<()> { - // A quick guide to move around in Vento - println!( - "{}, a CLI inventory for your files -© 2022 Lux Aliaga. Licensed under GPLv3 - -{} - - {}: Takes a file or directory and saves it in your inventory - - {}: Drops a file off of your inventory - - {}: Lists files in selected inventory - - {}: Switches slots - - {}: Initializes Vento - - {}: Displays this message", - format!("Vento").bold().blue(), - format!("Usage:").bold(), - format!("take | t ").bold().green(), - format!("drop | d [destination]") - .bold() - .green(), - format!("list | l [slot] [directory]").bold().green(), - format!("switch | s").bold().green(), - format!("init | i").bold().green(), - format!("help | h").bold().green() - ); - Ok(()) -}