diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/arg.rs | 8 | ||||
-rw-r--r-- | src/bin/git-sugpatch.rs | 59 | ||||
-rw-r--r-- | src/error.rs | 9 | ||||
-rw-r--r-- | src/lib.rs | 6 |
4 files changed, 72 insertions, 10 deletions
diff --git a/src/arg.rs b/src/arg.rs new file mode 100644 index 0000000..eaea67b --- /dev/null +++ b/src/arg.rs @@ -0,0 +1,8 @@ +use regex::{self, Regex}; + + +pub fn is_suggestion_id(s: &str) -> Result<bool, regex::Error> { + let re = Regex::new(r"^\d+$")?; + + Ok(re.is_match(s)) +} diff --git a/src/bin/git-sugpatch.rs b/src/bin/git-sugpatch.rs index 2a9b348..04b687d 100644 --- a/src/bin/git-sugpatch.rs +++ b/src/bin/git-sugpatch.rs @@ -1,8 +1,10 @@ use std::env; use std::process; -use github_suggestion::{Client, SuggestionUrl}; +use github_suggestion::{Client, Suggestion, SuggestionUrl}; use github_suggestion_cli::config::Config; +use github_suggestion_cli::error::Error; +use github_suggestion_cli::is_suggestion_id; fn main() { @@ -10,19 +12,56 @@ fn main() { let config = Config::get(&args).unwrap(); - if args.len() < 2 { + if config.suggestions.is_empty() { process::exit(111); } - let url: SuggestionUrl = args[1].parse().unwrap(); + let suggestions: Vec<Result<Suggestion, Error>> = config.suggestions + .iter() + .map(|s| { + let suggestion = if is_suggestion_id(s)? { + let client = Client::new( + &config.github_token, + &config.owner, + &config.repo, + ).unwrap(); - let client = Client::new( - &config.github_token, - &config.owner, - &config.repo, - ).unwrap(); + client.fetch(&s).unwrap() + } else { + let url: SuggestionUrl = args[1].parse().unwrap(); - let suggestion = client.fetch(&url.comment_id).unwrap(); + let client = Client::new( + &config.github_token, + &url.owner, + &url.repo, + ).unwrap(); - print!("{}", suggestion.diff().unwrap()); + client.fetch(&url.comment_id).unwrap() + }; + + Ok(suggestion) + }) + .collect(); + + let errors: Vec<&Error> = suggestions.iter() + .filter(|r| r.is_err()) + + // We know these `Results` are `Err`s. + .map(|r| r.as_ref().err().unwrap()) + .collect(); + + if !errors.is_empty() { + for error in errors { + eprintln!("error: {}", error); + } + + return; + } + + suggestions + .iter() + + // We've already checked for `Err`s above. + .map(|r| r.as_ref().unwrap()) + .for_each(|s| print!("{}", s.diff().unwrap())); } diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 0000000..c857bd2 --- /dev/null +++ b/src/error.rs @@ -0,0 +1,9 @@ +use regex; +use thiserror::Error; + + +#[derive(Debug, Error)] +pub enum Error { + #[error("Unable to parse regex")] + Regex(#[from] regex::Error), +} @@ -1,5 +1,11 @@ #![warn(rust_2018_idioms)] pub mod config; +pub mod error; pub(crate) mod owner_repo; + +mod arg; + + +pub use arg::is_suggestion_id; |