aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1
-rw-r--r--Cargo.toml1
-rw-r--r--src/arg.rs8
-rw-r--r--src/bin/git-sugpatch.rs59
-rw-r--r--src/error.rs9
-rw-r--r--src/lib.rs6
6 files changed, 74 insertions, 10 deletions
diff --git a/Cargo.lock b/Cargo.lock
index ff0c5d0..4be1b47 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -288,6 +288,7 @@ dependencies = [
"getopts",
"git2",
"github-suggestion",
+ "regex",
"thiserror",
"url",
]
diff --git a/Cargo.toml b/Cargo.toml
index cd03ae8..d0ce530 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,6 +6,7 @@ edition = "2018"
[dependencies]
getopts = "0.2.21"
git2 = "0.13.8"
+regex = "1.3.9"
thiserror = "1.0.20"
url = "2.1.1"
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),
+}
diff --git a/src/lib.rs b/src/lib.rs
index 494c389..0a8ab13 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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;