aboutsummaryrefslogtreecommitdiffstats
path: root/src/bin/git-sugpatch.rs
blob: 04b687d12f25930201521c979a037c4fc7b6b052 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
use std::env;
use std::process;

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() {
    let args: Vec<_> = env::args().collect();

    let config = Config::get(&args).unwrap();

    if config.suggestions.is_empty() {
        process::exit(111);
    }

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

                client.fetch(&s).unwrap()
            } else {
                let url: SuggestionUrl = args[1].parse().unwrap();

                let client = Client::new(
                    &config.github_token,
                    &url.owner,
                    &url.repo,
                ).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()));
}