From 227f76bc82046c979b13d4d7c9c99ea8013554b0 Mon Sep 17 00:00:00 2001 From: jojii Date: Mon, 15 Mar 2021 23:16:03 +0100 Subject: [PATCH] add cli parsing closes #2 --- Cargo.lock | 7 +++++ Cargo.toml | 1 + src/main.rs | 89 ++++++++++++++++++++++++++++++++++++----------------- 3 files changed, 68 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 18694ef..9498024 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,6 +9,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "argparse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f8ebf5827e4ac4fd5946560e6a99776ea73b596d80898f357007317a7141e47" + [[package]] name = "atty" version = "0.2.14" @@ -102,6 +108,7 @@ name = "jisho-cli" version = "0.1.3" dependencies = [ "ansi_term", + "argparse", "colored", "serde_json", "ureq", diff --git a/Cargo.toml b/Cargo.toml index de9fdb9..b1e9134 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,4 @@ ureq = { version = "2.0.2", features = ["json"] } serde_json = "1.0.64" ansi_term = "0.12.1" colored = "2.0.0" +argparse = "0.2.2" diff --git a/src/main.rs b/src/main.rs index 1a3ed15..aaa728d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,31 +1,35 @@ +use argparse::{ArgumentParser, List, Print, Store}; use colored::*; use serde_json::Value; -use std::env; - macro_rules! JISHO_URL { () => { "https://jisho.org/api/v1/search/words?keyword={}" }; } -const ITEM_LIMIT: usize = 4; + +#[derive(Debug, Clone)] +struct Options { + limit: usize, + query: String, + kanji: bool, // Sadly not (yet) supported by jisho.org's API +} + +impl Default for Options { + fn default() -> Self { + Self { + limit: 4, + query: String::default(), + kanji: false, + } + } +} fn main() -> Result<(), ureq::Error> { - // Get all parameter into one space separated query - let query = env::args().skip(1).collect::>().join(" "); - - // Check query not being empty - if query.is_empty() { - println!( - "Usage: {} []", - get_exec_name().unwrap_or_else(|| "jisho-cli".to_owned()) - ); - - return Ok(()); - } + let options = parse_args(); // Do API request - let body: Value = ureq::get(&format!(JISHO_URL!(), query)) + let body: Value = ureq::get(&format!(JISHO_URL!(), options.query)) .call()? .into_json()?; @@ -43,11 +47,11 @@ fn main() -> Result<(), ureq::Error> { // Iterate over meanings and print them for (i, entry) in body.iter().enumerate() { - if i > ITEM_LIMIT { + if i > options.limit { break; } - if print_item(&query, entry).is_some() && i + 1 != ITEM_LIMIT { + if print_item(&options.query, entry).is_some() && i != options.limit { println!(); } } @@ -90,8 +94,8 @@ fn format_sense(value: &Value, index: usize) -> String { let english_definiton = value_to_arr(english_definitons.unwrap()); - let parts_of_speech = if parts_of_speech.is_some() { - let parts = value_to_arr(parts_of_speech.unwrap()) + let parts_of_speech = if let Some(parts_of_speech) = parts_of_speech { + let parts = value_to_arr(parts_of_speech) .to_owned() .iter() .map(|i| { @@ -111,10 +115,10 @@ fn format_sense(value: &Value, index: usize) -> String { .collect::>() .join(", "); - if parts.len() > 0 { - format!("[{}]", parts.bright_blue()) - } else { + if parts.is_empty() { String::new() + } else { + format!("[{}]", parts.bright_blue()) } } else { String::new() @@ -198,16 +202,43 @@ fn value_to_str(value: &Value) -> &str { } } -fn value_to_arr<'a>(value: &'a Value) -> &'a Vec { +fn value_to_arr(value: &Value) -> &Vec { match value { Value::Array(a) => a, _ => unreachable!(), } } -fn get_exec_name() -> Option { - std::env::current_exe() - .ok() - .and_then(|pb| pb.file_name().map(|s| s.to_os_string())) - .and_then(|s| s.into_string().ok()) +fn parse_args() -> Options { + let mut options = Options::default(); + let mut query_vec: Vec = Vec::new(); + { + let mut ap = ArgumentParser::new(); + ap.set_description("Use jisho.org from cli"); + ap.add_option( + &["-V", "--version"], + Print(env!("CARGO_PKG_VERSION").to_string()), + "Show version", + ); + ap.refer(&mut options.limit).add_option( + &["-n", "--limit"], + Store, + "Limit the amount of results", + ); + ap.refer(&mut query_vec) + .add_argument("Query", List, "The query to search for"); + + /* Uncomment when supported by jisho.org + ap.refer(&mut options.kanji).add_option( + &["--kanji", "-k"], + StoreFalse, + "Look up a certain kanji", + ); + */ + + ap.parse_args_or_exit(); + } + + options.query = query_vec.join(" "); + options }