1
0
Fork 0
mirror of https://git.sr.ht/~nixgoat/vento synced 2024-11-24 15:55:17 +00:00

Compare commits

...

4 commits

Author SHA1 Message Date
Lux Aliaga d0ddc93b47 Merge pull request 'Refactoring' (#9) from refactor into master
Reviewed-on: https://codeberg.org/nixgoat/vento/pulls/9
2022-10-18 01:22:37 +02:00
Lux Aliaga 3b9a405614
build: Use struct for page data
The tuple approach was a bit complicated, so I decided to switch it out
for a Page struct. Yes, I have an obsession with structs.
2022-10-17 20:09:44 -03:00
Lux Aliaga 5e05bfa2ef
src: Removed unnecessary contexts
This commit should remove some contexts that actually made some errors
more difficult to read. They will now display the idiomatic errors
generated by anyhow.
2022-10-17 19:56:23 -03:00
Lux Aliaga d51163ef09
common: Use struct to deliver settings
After learning more about structs, I've decided to try and use them in
the common module. It replaces the original behavior of delivering the
data using a vector in favor of the Settings struct, also defined on the
same file.
2022-10-17 18:11:38 -03:00
4 changed files with 68 additions and 46 deletions

View file

@ -23,6 +23,11 @@ use std::env;
use std::fs::{create_dir_all, File}; use std::fs::{create_dir_all, File};
use std::io::Write; use std::io::Write;
struct Page {
content: String,
file: String,
}
fn main() -> Result<()> { fn main() -> Result<()> {
if cfg!(unix) { if cfg!(unix) {
let pages = [vento()?, take()?, drop()?, ventotoml()?]; let pages = [vento()?, take()?, drop()?, ventotoml()?];
@ -32,16 +37,16 @@ fn main() -> Result<()> {
create_dir_all(tempdir.clone())?; create_dir_all(tempdir.clone())?;
for page in &pages { for page in &pages {
let tempfile = tempdir.join(page.clone().1); let tempfile = tempdir.join(&page.file);
let mut file = File::create(tempfile).unwrap(); let mut file = File::create(tempfile).unwrap();
write!(&mut file, "{}", page.clone().0).unwrap(); write!(&mut file, "{}", &page.content).unwrap();
} }
} }
Ok(()) Ok(())
} }
fn vento() -> Result<(String, String)> { fn vento() -> Result<Page> {
let page = Manual::new("vento") let content = Manual::new("vento")
.about("a CLI inventory for your files") .about("a CLI inventory for your files")
.author(Author::new("Lux Aliaga").email("they@mint.lgbt")) .author(Author::new("Lux Aliaga").email("they@mint.lgbt"))
.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.") .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.")
@ -76,11 +81,14 @@ fn vento() -> Result<(String, String)> {
) )
.render(); .render();
Ok((page, String::from("vento.1"))) Ok(Page {
content,
file: String::from("vento.1"),
})
} }
fn take() -> Result<(String, String)> { fn take() -> Result<Page> {
let page = Manual::new("take") let content = Manual::new("take")
.about("a file grabber for Vento") .about("a file grabber for Vento")
.author(Author::new("Lux Aliaga").email("they@mint.lgbt")) .author(Author::new("Lux Aliaga").email("they@mint.lgbt"))
.description("Take FILE and put it in the inventory.") .description("Take FILE and put it in the inventory.")
@ -93,11 +101,14 @@ fn take() -> Result<(String, String)> {
.arg(Arg::new("FILE")) .arg(Arg::new("FILE"))
.render(); .render();
Ok((page, String::from("take.1"))) Ok(Page {
content,
file: String::from("take.1"),
})
} }
fn drop() -> Result<(String, String)> { fn drop() -> Result<Page> {
let page = Manual::new("drop") let content = Manual::new("drop")
.about("a file dropper for Vento") .about("a file dropper for Vento")
.author(Author::new("Lux Aliaga").email("they@mint.lgbt")) .author(Author::new("Lux Aliaga").email("they@mint.lgbt"))
.description("Take FILE off the inventory and drop it in DESTINATION.") .description("Take FILE off the inventory and drop it in DESTINATION.")
@ -111,11 +122,14 @@ fn drop() -> Result<(String, String)> {
.arg(Arg::new("[DESTINATION]")) .arg(Arg::new("[DESTINATION]"))
.render(); .render();
Ok((page, String::from("drop.1"))) Ok(Page {
content,
file: String::from("drop.1"),
})
} }
fn ventotoml() -> Result<(String, String)> { fn ventotoml() -> Result<Page> {
let page = Manual::new("vento.toml") let content = Manual::new("vento.toml")
.about("configuration file for Vento") .about("configuration file for Vento")
.author(Author::new("Lux Aliaga").email("they@mint.lgbt")) .author(Author::new("Lux Aliaga").email("they@mint.lgbt"))
.description("This is the configuration file for the vento(1), take(1) and drop(1) utilities. Its presence and all its directives are optional.") .description("This is the configuration file for the vento(1), take(1) and drop(1) utilities. Its presence and all its directives are optional.")
@ -131,5 +145,8 @@ fn ventotoml() -> Result<(String, String)> {
) )
.render(); .render();
Ok((page, String::from("vento.toml.1"))) Ok(Page {
content,
file: String::from("vento.toml.1"),
})
} }

View file

@ -22,7 +22,13 @@ use colored::Colorize;
use config::Config; use config::Config;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
pub fn env_config() -> Result<Vec<PathBuf>> { pub struct Settings {
pub vento_dir: PathBuf,
pub active_dir: PathBuf,
pub inactive_dir: PathBuf,
}
pub fn env_config() -> Result<Settings> {
// Configures the directories for Vento // Configures the directories for Vento
let home = match dirs::home_dir() { let home = match dirs::home_dir() {
Option::Some(dir) => dir, Option::Some(dir) => dir,
@ -45,7 +51,11 @@ pub fn env_config() -> Result<Vec<PathBuf>> {
.iter() .iter()
.collect(); .collect();
Ok(vec![vento_dir, active_dir, inactive_dir]) Ok(Settings {
vento_dir,
active_dir,
inactive_dir,
})
} }
fn dir_config() -> Result<String> { fn dir_config() -> Result<String> {

View file

@ -27,16 +27,14 @@ use std::{fs, process};
pub fn init() -> Result<()> { pub fn init() -> Result<()> {
// Initializes Vento // Initializes Vento
let ventodir = &common::env_config()?[0]; let ventodir = &common::env_config()?.vento_dir;
if ventodir.is_dir() { if ventodir.is_dir() {
// Checks if Vento has already been initialized and prompts the user if they want to initialize it again // Checks if Vento has already been initialized and prompts the user if they want to initialize it again
let mut answer = String::new(); let mut answer = String::new();
print!("⚠️ {} Vento has already been initialized. Reinitializing will delete all files on the directory for Vento. Do you wish to proceed? (y/N) ", "WARNING:".bold().red()); print!("⚠️ {} Vento has already been initialized. Reinitializing will delete all files on the directory for Vento. Do you wish to proceed? (y/N) ", "WARNING:".bold().red());
let _ = io::stdout().flush(); let _ = io::stdout().flush();
io::stdin() io::stdin().read_line(&mut answer)?;
.read_line(&mut answer)
.context("Failed to read input")?;
match answer.as_str().trim() { match answer.as_str().trim() {
"y" | "Y" => fs::remove_dir_all(&ventodir)?, "y" | "Y" => fs::remove_dir_all(&ventodir)?,
_ => process::exit(0), _ => process::exit(0),
@ -49,7 +47,7 @@ pub fn init() -> Result<()> {
pub fn list(slot: &str, dir: &str) -> Result<()> { pub fn list(slot: &str, dir: &str) -> Result<()> {
// Lists files in inventory // Lists files in inventory
let ventodir = &common::env_config()?[0]; let ventodir = &common::env_config()?.vento_dir;
if !ventodir.is_dir() { if !ventodir.is_dir() {
// Detects if Vento hasn't been initialized and bails if so // Detects if Vento hasn't been initialized and bails if so
@ -60,8 +58,8 @@ pub fn list(slot: &str, dir: &str) -> Result<()> {
} }
let mut slotdir: PathBuf = match slot { let mut slotdir: PathBuf = match slot {
"active" | "a" => common::env_config()?[1].clone(), "active" | "a" => common::env_config()?.active_dir.clone(),
"inactive" | "i" => common::env_config()?[2].clone(), "inactive" | "i" => common::env_config()?.inactive_dir.clone(),
_ => PathBuf::new(), _ => PathBuf::new(),
}; };
@ -168,9 +166,9 @@ pub fn list(slot: &str, dir: &str) -> Result<()> {
pub fn switch() -> Result<()> { pub fn switch() -> Result<()> {
// Switches between inventory slots // Switches between inventory slots
let ventodir = &common::env_config()?[0]; let ventodir = &common::env_config()?.vento_dir;
let active = &common::env_config()?[1]; let active = &common::env_config()?.active_dir;
let inactive = &common::env_config()?[2]; let inactive = &common::env_config()?.inactive_dir;
let temp: PathBuf = [ventodir.to_path_buf(), Path::new("temp").to_path_buf()] let temp: PathBuf = [ventodir.to_path_buf(), Path::new("temp").to_path_buf()]
.iter() .iter()
.collect(); .collect();
@ -187,13 +185,11 @@ pub fn switch() -> Result<()> {
fn create_slots() -> Result<()> { fn create_slots() -> Result<()> {
// Used only on init. Creates all required directories // Used only on init. Creates all required directories
let active = &common::env_config()?[1]; let active = &common::env_config()?.active_dir;
let inactive = &common::env_config()?[2]; let inactive = &common::env_config()?.inactive_dir;
let initialize_error = "Vento was unable to initalize. Do you have the correct permissions?"; fs::create_dir_all(active)?;
fs::create_dir_all(inactive)?;
fs::create_dir_all(active).context(initialize_error)?;
fs::create_dir_all(inactive).context(initialize_error)?;
println!("🎉 {}", "Vento has been succesfully initialized!".green()); println!("🎉 {}", "Vento has been succesfully initialized!".green());
Ok(()) Ok(())

View file

@ -18,7 +18,7 @@
*/ */
use super::common; use super::common;
use anyhow::{bail, Context, Result}; use anyhow::{bail, Result};
use colored::Colorize; use colored::Colorize;
use fs_extra::dir::{move_dir, CopyOptions}; use fs_extra::dir::{move_dir, CopyOptions};
use std::fs; use std::fs;
@ -26,7 +26,7 @@ use std::path::{Path, PathBuf};
pub fn take(file: &String, slot: &str) -> Result<()> { pub fn take(file: &String, slot: &str) -> Result<()> {
// Takes a file or directory // Takes a file or directory
let ventodir = &common::env_config()?[0]; let ventodir = &common::env_config()?.vento_dir;
if !ventodir.is_dir() { if !ventodir.is_dir() {
// Detects if Vento hasn't been initialized and bails if so // Detects if Vento hasn't been initialized and bails if so
@ -36,8 +36,8 @@ pub fn take(file: &String, slot: &str) -> Result<()> {
); );
}; };
let slotdir: PathBuf = match slot { let slotdir: PathBuf = match slot {
"active" | "a" => common::env_config()?[1].clone(), "active" | "a" => common::env_config()?.active_dir.clone(),
"inactive" | "i" => common::env_config()?[2].clone(), "inactive" | "i" => common::env_config()?.inactive_dir.clone(),
_ => PathBuf::new(), _ => PathBuf::new(),
}; };
@ -80,11 +80,11 @@ pub fn take(file: &String, slot: &str) -> Result<()> {
if sourcepath.is_file() | sourcepath.is_symlink() { if sourcepath.is_file() | sourcepath.is_symlink() {
// Checks the path's file type // Checks the path's file type
fs::copy(&file, &destpath).context("Vento was unable to copy the file.")?; fs::copy(&file, &destpath)?;
fs::remove_file(&file).context("Vento was unable to remove the file.")?; fs::remove_file(&file)?;
} else if sourcepath.is_dir() { } else if sourcepath.is_dir() {
let options = CopyOptions::new(); let options = CopyOptions::new();
move_dir(&file, &slotdir, &options).context("Vento was unable to move the directory.")?; move_dir(&file, &slotdir, &options)?;
} else { } else {
bail!("{}", "No such file or directory.".red()); bail!("{}", "No such file or directory.".red());
} }
@ -94,7 +94,7 @@ pub fn take(file: &String, slot: &str) -> Result<()> {
pub fn drop(file: &String, slot: &str, dest: PathBuf) -> Result<()> { pub fn drop(file: &String, slot: &str, dest: PathBuf) -> Result<()> {
// Drops a file or directory // Drops a file or directory
let ventodir = &common::env_config()?[0]; let ventodir = &common::env_config()?.vento_dir;
if !ventodir.is_dir() { if !ventodir.is_dir() {
// Detects if Vento hasn't been initialized and bails if so // Detects if Vento hasn't been initialized and bails if so
@ -105,8 +105,8 @@ pub fn drop(file: &String, slot: &str, dest: PathBuf) -> Result<()> {
}; };
let slotdir: PathBuf = match slot { let slotdir: PathBuf = match slot {
"active" | "a" => common::env_config()?[1].clone(), "active" | "a" => common::env_config()?.active_dir.clone(),
"inactive" | "i" => common::env_config()?[2].clone(), "inactive" | "i" => common::env_config()?.inactive_dir.clone(),
_ => PathBuf::new(), _ => PathBuf::new(),
}; };
@ -138,13 +138,12 @@ pub fn drop(file: &String, slot: &str, dest: PathBuf) -> Result<()> {
if sourcepath.is_file() | sourcepath.is_symlink() { if sourcepath.is_file() | sourcepath.is_symlink() {
// Checks the path's file type // Checks the path's file type
fs::copy(&sourcepath, &destpath).context("Vento was unable to copy the file.")?; fs::copy(&sourcepath, &destpath)?;
fs::remove_file(&sourcepath).context("Vento was unable to remove the file.")?; fs::remove_file(&sourcepath)?;
} else if sourcepath.is_dir() { } else if sourcepath.is_dir() {
let destpath: PathBuf = Path::new(&dest).to_path_buf(); let destpath: PathBuf = Path::new(&dest).to_path_buf();
let options = CopyOptions::new(); let options = CopyOptions::new();
move_dir(&sourcepath, &destpath, &options) move_dir(&sourcepath, &destpath, &options)?;
.context("Vento was unable to move the directory.")?;
} else { } else {
bail!("{}", "No such file or directory.".red()); bail!("{}", "No such file or directory.".red());
} }