diff --git a/Cargo.lock b/Cargo.lock index 122eff1..ab2d86b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,55 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "anstream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is-terminal", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + +[[package]] +name = "anstyle-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +dependencies = [ + "anstyle", + "windows-sys 0.48.0", +] + [[package]] name = "anyhow" version = "1.0.71" @@ -26,12 +75,66 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "clap" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2" +dependencies = [ + "clap_builder", + "clap_derive", + "once_cell", +] + +[[package]] +name = "clap_builder" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" +dependencies = [ + "anstream", + "anstyle", + "bitflags", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.18", +] + +[[package]] +name = "clap_lex" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "crossterm" version = "0.26.1" @@ -57,12 +160,45 @@ dependencies = [ "winapi", ] +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + [[package]] name = "indexmap" version = "1.9.3" @@ -94,6 +230,29 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" +dependencies = [ + "hermit-abi", + "io-lifetimes", + "rustix", + "windows-sys 0.48.0", +] + [[package]] name = "itoa" version = "1.0.6" @@ -105,6 +264,7 @@ name = "kanban-tui" version = "0.1.0" dependencies = [ "anyhow", + "clap", "crossterm", "int-enum", "ratatui", @@ -120,6 +280,12 @@ version = "0.2.145" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc86cde3ff845662b8f4ef6cb50ea0e20c524eb3d29ae048287e06a1b3fa6a81" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + [[package]] name = "lock_api" version = "0.4.9" @@ -233,6 +399,20 @@ dependencies = [ "bitflags", ] +[[package]] +name = "rustix" +version = "0.37.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + [[package]] name = "ryu" version = "1.0.13" @@ -312,6 +492,12 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "syn" version = "1.0.109" @@ -398,6 +584,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index 4306c8d..72b7733 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,4 +13,5 @@ serde = { version = "1.0.148" , features = [ "derive" ] } serde_json = "1.0.89" int-enum = "0.5.0" thiserror = "1" -anyhow = "1" \ No newline at end of file +anyhow = "1" +clap = { version = "4.3.2" , features = [ "derive" ] } \ No newline at end of file diff --git a/src/app.rs b/src/app.rs index 1cd895b..0b11bf7 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2,7 +2,7 @@ // use int_enum::IntEnum; use serde::{Deserialize, Serialize}; use std::cmp::min; -use std::fs::OpenOptions; +use std::fs::{File}; use std::io::Read; use tui_textarea::TextArea; @@ -166,17 +166,11 @@ impl Project { serde_json::from_str(json).map_err(|_| KanbanError::BadJson) } - pub fn load(filepath: String) -> Result { - let mut file = OpenOptions::new() - .write(true) - .read(true) - .create(true) - .open(&filepath)?; - + pub fn load(path: String, mut file: &File) -> Result { let mut json = String::new(); file.read_to_string(&mut json)?; if json.is_empty() { - Ok(Project::new("", filepath)) + Ok(Project::new("", path)) } else { Self::load_from_json(&json) } diff --git a/src/main.rs b/src/main.rs index 8a31fc4..581f740 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -#![deny(rust_2018_idioms)] +#![deny(rust_2018_idioms)] #![allow(unused_imports)] #![allow(dead_code)] use kanban_tui::*; @@ -6,13 +6,56 @@ use crossterm::{ event::*, terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, }; -use std::{io, env}; +use std::{io, env, path::PathBuf, fs::{File, OpenOptions}, error::Error}; use tui::backend::CrosstermBackend; use tui::Terminal; +use clap::Parser; -fn main() -> anyhow::Result<()> { - let pattern = env::args().nth(1).unwrap_or("kanban.json".to_string()); - let mut state = AppState::new(Project::load(pattern)?); +#[derive(Debug, Parser)] +#[command(name = "kanban")] +/// kanban-tui is a simple, interactive TUI based task manager using kanban columns +pub struct CliArgs { + #[arg(short('d'), long("database"), value_name="DATABASE")] + /// Path to the + pub filepath: Option +} + +fn prompt_project_init() -> (String, io::Result) { + let _msg = "Database not found, would you like to start a new project?"; + let filepath = "kanban.json"; + (filepath.to_string(), + OpenOptions::new() + .write(true) + .read(true) + .create(true) + .open(filepath)) +} + +fn main() -> anyhow::Result<(), Box> { + let (filepath, file) = + match CliArgs::parse() { + CliArgs { filepath: Some(filepath) } => { + let fpath = filepath.into_os_string().into_string().unwrap(); + let file = OpenOptions::new() + .write(true) + .read(true) + .create(true) + .open(&fpath); + + match file { + Ok(f) => (fpath, f), + Err(_) => { + let (fp, fname) = prompt_project_init(); + (fp, fname.unwrap()) + } + } + }, + CliArgs { filepath: None } => { + let (fp, fname) = prompt_project_init(); + (fp, fname.unwrap()) + } + }; + let mut state = AppState::new(Project::load(filepath, &file)?); enable_raw_mode()?; let mut stdout = io::stdout();