Prompt the user for a project name if it can't find the database file
This commit is contained in:
parent
bc81c05f1f
commit
f081238e33
@ -169,7 +169,7 @@ impl Project {
|
||||
pub fn load(path: String, mut file: &File) -> Result<Self, KanbanError> {
|
||||
let mut json = String::new();
|
||||
file.read_to_string(&mut json)?;
|
||||
if json.is_empty() {
|
||||
if json.trim().is_empty() {
|
||||
Ok(Project::new("", path))
|
||||
} else {
|
||||
Self::load_from_json(&json)
|
||||
|
51
src/main.rs
51
src/main.rs
@ -6,29 +6,47 @@ use crossterm::{
|
||||
event::*,
|
||||
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
|
||||
};
|
||||
use std::{io, env, path::PathBuf, fs::{File, OpenOptions}, error::Error};
|
||||
use std::{io::{self, Write}, env, path::PathBuf, fs::{File, OpenOptions}, error::Error};
|
||||
use tui::backend::CrosstermBackend;
|
||||
use tui::Terminal;
|
||||
use clap::Parser;
|
||||
use clap::{Parser, ValueHint::FilePath};
|
||||
|
||||
#[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")]
|
||||
#[arg(short('d'), long("database"), value_name="DATABASE", value_hint=FilePath)]
|
||||
/// Path to the
|
||||
pub filepath: Option<PathBuf>
|
||||
}
|
||||
|
||||
fn prompt_project_init() -> (String, io::Result<File>) {
|
||||
let _msg = "Database not found, would you like to start a new project?";
|
||||
let filepath = "kanban.json";
|
||||
(filepath.to_string(),
|
||||
const DEFAULT_DATABASE_NAME: &str = "kanban.json";
|
||||
|
||||
fn prompt_project_init(default_name: &str) -> (String, io::Result<File>) {
|
||||
let mut input = String::new();
|
||||
|
||||
println!("Database not found, select the name of the database if it exists or enter a name to start a new project");
|
||||
print!("Database name (default: {}): ", default_name);
|
||||
io::stdout().flush().unwrap();
|
||||
|
||||
let result = io::stdin().read_line(&mut input);
|
||||
let input = input.trim();
|
||||
|
||||
let filename =
|
||||
match result {
|
||||
Ok(b) if b > 0 && !input.is_empty() => input,
|
||||
_ => default_name
|
||||
};
|
||||
|
||||
// TODO: This might be a good time to prompt the user if they want
|
||||
// to change the default column names
|
||||
|
||||
(filename.to_string(),
|
||||
OpenOptions::new()
|
||||
.write(true)
|
||||
.read(true)
|
||||
.create(true)
|
||||
.open(filepath))
|
||||
.open(filename))
|
||||
}
|
||||
|
||||
fn main() -> anyhow::Result<(), Box<dyn Error>> {
|
||||
@ -39,20 +57,27 @@ fn main() -> anyhow::Result<(), Box<dyn Error>> {
|
||||
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();
|
||||
let (fp, fname) = prompt_project_init(&fpath);
|
||||
(fp, fname.unwrap())
|
||||
}
|
||||
}
|
||||
},
|
||||
CliArgs { filepath: None } => {
|
||||
let (fp, fname) = prompt_project_init();
|
||||
(fp, fname.unwrap())
|
||||
let file = OpenOptions::new()
|
||||
.write(true)
|
||||
.read(true)
|
||||
.open(DEFAULT_DATABASE_NAME);
|
||||
if let Ok(f) = file {
|
||||
(DEFAULT_DATABASE_NAME.to_string(), f)
|
||||
} else {
|
||||
let (fp, fname) = prompt_project_init(DEFAULT_DATABASE_NAME);
|
||||
(fp, fname.unwrap())
|
||||
}
|
||||
}
|
||||
};
|
||||
let mut state = AppState::new(Project::load(filepath, &file)?);
|
||||
@ -68,7 +93,7 @@ fn main() -> anyhow::Result<(), Box<dyn Error>> {
|
||||
kanban_tui::handle_input(&mut state)?;
|
||||
}
|
||||
|
||||
state.project.save();
|
||||
// state.project.save();
|
||||
|
||||
// restore terminal
|
||||
disable_raw_mode()?;
|
||||
|
Loading…
x
Reference in New Issue
Block a user