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; | 
