diff options
author | Teddy Wing | 2020-08-02 00:10:19 +0200 |
---|---|---|
committer | Teddy Wing | 2020-08-02 00:18:47 +0200 |
commit | dff81f7b84c279d7e00fe7a885743605a2ac5b7e (patch) | |
tree | b65441e5efa1155cb33134f3645980610a1e0db5 /src | |
parent | 166a85b3f3796ce9dce91004b0b99eed10443e3a (diff) | |
download | git-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')
-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; |