use crate::{app::fatal, docs, editor, search, storage};
use std::{
env,
io::{self, Write},
};
pub fn dispatcher() {
let args: Vec<String> = env::args().collect();
let _invoke = &args[0];
if args.len() < 2 {
docs::help();
return;
}
let args: Vec<String> = args[1..].to_vec();
if args[0] == "." || args[0] == "--add" {
let title = if args.len() > 1 {
args[1..].join(" ")
} else {
get_title()
};
storage::new_article(title);
} else if &'-'
== match &args[0].chars().nth(0) {
Some(val) => val,
_ => &'+',
}
{
match args[0].as_str() {
"-h" | "--help" => {
docs::help();
}
"-v" | "--version" => {
docs::version();
}
"--help-verbose" => {
docs::help_verbose();
}
_ => {
println!("Invalid flag!\n");
docs::help();
}
}
} else {
search::search(args.join(" "));
}
}
fn get_title() -> String {
print!("Enter a title: ");
io::stdout().flush().unwrap();
let mut title = String::new();
io::stdin().read_line(&mut title).expect("Error reading!");
let title: String = title.trim().parse().unwrap();
if title.is_empty() {
fatal("Invalid title!");
}
let title: String = title.to_lowercase();
title
}
pub fn search_result(result_arr: Vec<search::Field>) {
let mut input = String::new();
let title: String;
if result_arr.is_empty() {
println!(" No matches!");
return;
} else if result_arr.len() == 1 {
println!(" Exactly one match found: {}", result_arr[0].display_name);
title = result_arr[0].file.clone();
} else {
for (index, field) in result_arr.iter().enumerate() {
println!(" {}. {}", index + 1, field.display_name);
}
println!("");
loop {
print!(":: Enter file number to interact: ");
io::stdout().flush().unwrap();
input.clear();
match io::stdin().read_line(&mut input) {
Ok(_) => (),
Err(_) => {
eprintln!(" Error reading!");
continue;
}
};
input = input.trim().to_string();
if input == "" || input == "q" || input == "Q" {
return;
}
let n = match input.parse::<usize>() {
Ok(value) => value,
Err(_) => {
eprintln!(
" Invalid input! Expected 1-{} (or press Enter to exit)",
result_arr.len()
);
continue;
}
};
match n <= result_arr.len() {
true => {
title = result_arr[n - 1].file.clone();
}
false => {
eprintln!(
" Invalid input! Expected 1-{} (or press Enter to exit)",
result_arr.len()
);
continue;
}
}
break;
}
}
input.clear();
print!(":: Display content (r) OR open in editor (w)? [R/w] ");
io::stdout().flush().unwrap();
io::stdin().read_line(&mut input).expect(" Error reading!");
match input.trim() {
"r" | "R" | "" => storage::read_article(title),
"w" | "W" => editor::open_editor(title),
_ => println!(" Invalid input!"),
}
}