aboutsummaryrefslogtreecommitdiffstats
path: root/src/bin/git-sugpatch.rs
diff options
context:
space:
mode:
authorTeddy Wing2020-08-02 00:10:19 +0200
committerTeddy Wing2020-08-02 00:18:47 +0200
commitdff81f7b84c279d7e00fe7a885743605a2ac5b7e (patch)
treeb65441e5efa1155cb33134f3645980610a1e0db5 /src/bin/git-sugpatch.rs
parent166a85b3f3796ce9dce91004b0b99eed10443e3a (diff)
downloadgit-suggestion-dff81f7b84c279d7e00fe7a885743605a2ac5b7e.tar.bz2
git-sugpatch: Accept multiple suggestion args; Accept suggestion ID args
Add the ability to pass multiple suggestions to the binary. The diffs will appear in the output one after another. Also allow suggestions to be specified by their comment ID instead of their full URL. This uses the Git repo's remote to determine the owner-repo pair. When a URL argument is given, the owner-repo pair is extracted from the URL. It's now possible to call the binary like this: $ git-sugpatch 459692838 \ > https://github.com/teddywing/suggestion-test/pull/1#discussion_r459691747
Diffstat (limited to 'src/bin/git-sugpatch.rs')
-rw-r--r--src/bin/git-sugpatch.rs59
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()));
}