diff --git a/README.md b/README.md new file mode 100644 index 0000000..0df7076 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +A silly little CLI note app + +[Downloads under Releases](https://git.maidsin.space/catto/snotes/releases) + +# Usage + +``` +Usage: snotes [OPTIONS] + +Options: + -c, --create Create a new note: --create "Hello World" [default: ] + -s, --show Show the latest entries + --showall Show all entries + -t, --tag Append or show entries with tag [default: ] + -d, --delete Delete the latest entry + -h, --help Print help + -V, --version Print version +``` + +# Demo + +![demo gif](media/Peek 2024-04-04 20-55.gif) + +# Building (Linux) + +- Clone this repo `git clone "https://git.maidsin.space/catto/snotes.git"` +- [Install Rust](https://www.rust-lang.org/learn/get-started) +- run `carog build --release` in the root of the project +- You now have a working `snotes` binary file under `target/release` + +Windows Builds might be a bit more involved since this dependency builds and bundles sqlite3 [https://github.com/rusqlite/rusqlite](https://github.com/rusqlite/rusqlite) + +# Installation + +You could copy the `snotes` binary into a `/usr/bin` or `~/.local/bin` folder, one that's part of your system PATH so you can run it anywhere. diff --git a/media/Peek 2024-04-04 20-55.gif b/media/Peek 2024-04-04 20-55.gif new file mode 100644 index 0000000..2401a1f Binary files /dev/null and b/media/Peek 2024-04-04 20-55.gif differ diff --git a/src/main.rs b/src/main.rs index 091849f..11f9bb3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,9 @@ struct Args { /// Append or show entries with tag #[arg(short, long, default_value_t = String::new())] tag: String, + /// Delete the latest entry + #[arg(short, long, default_value_t = false)] + delete: bool, } struct Note { @@ -30,13 +33,13 @@ fn main() { let args = Args::parse(); match init_db() { - Ok(_) => println!(), + Ok(_) => (), Err(e) => println!("Failed to initialize DB: {}", e), }; if args.show { match show_notes(false, &args.tag) { - Ok(_) => println!(), + Ok(_) => (), Err(e) => println!("Failed to show DB: {}", e), } return; @@ -44,23 +47,39 @@ fn main() { if args.create != String::new() { match create_note(&args.create, &args.tag) { - Ok(_) => println!(), + Ok(_) => (), Err(e) => println!("Failed to throw into DB: {}", e), } + return; } if args.showall { match show_notes(true, &args.tag) { - Ok(_) => println!(), + Ok(_) => (), Err(e) => println!("Failed to show DB: {}", e), } + return; } if args.tag != String::new() && args.create == String::new() { match show_notes(true, &args.tag) { - Ok(_) => println!(), + Ok(_) => (), Err(e) => println!("Failed to show DB: {}", e), } + return; + } + + if args.delete { + match delete_latest_note() { + Ok(_) => (), + Err(e) => println!("Failed to delete: {}", e), + } + return; + } + + match show_notes(false, &args.tag) { + Ok(_) => println!(), + Err(e) => println!("Failed to show DB: {}", e), } } @@ -78,7 +97,7 @@ fn init_db() -> Result<()> { "; match connection.execute(query_table, []) { - Ok(v) => println!("INIT OK {}", v), + Ok(_) => (), Err(e) => println!("INIT ERR {}", e), }; @@ -139,3 +158,17 @@ fn show_notes(all: bool, tag: &String) -> Result<()> { } Ok(()) } + +fn delete_latest_note() -> Result<()> { + let home = home_dir().unwrap().join(".snotes.db"); + let connection = Connection::open(home)?; + + let query = String::from("DELETE FROM NOTES WHERE nid = (SELECT MAX(nid) FROM notes)"); + + match connection.execute(&query, []) { + Ok(v) => println!("DELETE OK {}", v), + Err(e) => println!("DELETE ERR {}", e), + } + + Ok(()) +}