diff options
Diffstat (limited to 'src/bin')
-rw-r--r-- | src/bin/git-sugpatch.rs | 59 |
1 files changed, 49 insertions, 10 deletions
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())); } |