From 10eb4b0f10f171f098eef837392a245f9ee50330 Mon Sep 17 00:00:00 2001 From: voidarc Date: Fri, 21 Aug 2026 15:02:45 +0100 Subject: [PATCH] rm function now working --- src/main.rs | 48 ++++++++++++++++++++++++++++++++++++++++++------ src/utils.rs | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index ca72f8b..8499255 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,6 +31,7 @@ fn main() { &_ => add_files(&arg, &mut args, &mut current_shelf), } } else { + // Should be replaced by help function println!("no parameters") } let _ = save_library(library); @@ -45,7 +46,7 @@ fn list_library(library: &mut Library) { println!("Current Shelf: {}", ¤t_shelf.name); println!("Content: "); for path in ¤t_shelf.content { - println!("{}", path) + println!(" - {}", path) } } @@ -53,7 +54,16 @@ fn add_files(current_arg: &str, args: &mut env::Args, shelf: &mut Shelf) { // Callable function thing let mut add_file = |file: &str| { let file_path = Path::new(&file); - let absolute_path = Path::canonicalize(&file_path).expect("something wrong"); + let absolute_path = Path::canonicalize(&file_path).expect("Path cannot be Cannonicalized"); + + match utils::match_file_name(&file, shelf) { + Ok(_) => { + // Prevent existing files from being added to shelf + println!("File {} is already in current shelf", file); + process::exit(0) + } + Err(_) => {} // Continue with function + } let _ = shelf .content @@ -63,6 +73,7 @@ fn add_files(current_arg: &str, args: &mut env::Args, shelf: &mut Shelf) { return; }; + // If add wasn't specified add the file if current_arg != "add" { add_file(¤t_arg) } @@ -74,14 +85,39 @@ fn add_files(current_arg: &str, args: &mut env::Args, shelf: &mut Shelf) { } fn remove_files(args: &mut env::Args, shelf: &mut Shelf) { + if shelf.content.len() < 1 { + println!( + "Shelf \"{}\" is Empty. Are you using the right shelf?", + shelf.name + ); + return; + } if args.len() > 0 { for file in args { - match file.parse::() { + // If the argument is a number instead of a file name + let index: usize = match file.parse::() { Ok(index) => { - println!("path is: {}", &shelf.content[*&index]) + println!("path is: {}", &shelf.content[*&index]); + index } - Err(_) => {} - } + Err(_) => match utils::match_file_name(&file, shelf) { + Ok(index) => { + println!("path is: {}", &shelf.content[*&index as usize]); + index + } + Err(e) => { + eprintln!("{e}"); + process::exit(1) + } + }, + }; + let file_path = Path::new(&shelf.content[index]); + println!( + "Removed file {} from shelf {}", + file_path.canonicalize().unwrap().to_str().unwrap(), + shelf.name + ); + shelf.content.remove(index); } } else { // If there's no file specified, clear the whole thing diff --git a/src/utils.rs b/src/utils.rs index 6b83f36..862baf9 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,5 +1,5 @@ use crate::structs::{Library, Shelf}; -use std::{env, fs, io, io::Read}; +use std::{env, fs, io, io::Read, path::Path}; use xdg::BaseDirectories; pub fn get_shelf_index(shelves: &Vec, id: &u8) -> Option { @@ -51,6 +51,8 @@ pub fn get_current_shelf(library: &mut Library) -> &mut Shelf { // Get current shelf index and push the file let current_shelf = &mut library.shelves[*&shelf_index]; + current_shelf.content.sort(); + current_shelf.content.dedup(); return current_shelf; } @@ -69,3 +71,36 @@ pub fn initialize_library() -> Library { }; return default_library; } + +pub fn match_file_name(file_name: &str, shelf: &mut Shelf) -> Result { + // Turn given file into string + let match_path = Path::new(file_name); + + // If the file path doesnt exist + if !match_path.exists() { + let file_ending = match_path.file_name().expect("Error getting file name"); + // For every entry in current shelf + for (i, path) in shelf.content.iter().enumerate() { + // Turn the string back into a path + let shelf_path = Path::new(path).canonicalize()?; + + if shelf_path.ends_with(file_ending) { + return Ok(i); + }; + } + } // else if it does + + let cannonical_path = match_path.canonicalize()?; + + for (i, path) in shelf.content.iter().enumerate() { + let shelf_path = Path::new(path).canonicalize()?; + if cannonical_path == shelf_path { + return Ok(i); + } + } + + Err(io::Error::new( + io::ErrorKind::NotFound, + format!("File not Found in Shelf \"{}\": {file_name}", shelf.name), + )) +}