1
mod server;
2

            
3
use review_harvest::git::harvest;
4
use std::path::PathBuf;
5

            
6
const HELP: &str = "\
7
harvest
8

            
9
USAGE:
10
  harvest [OPTIONS]
11

            
12
FLAGS:
13
  -h, --help            Prints help information
14

            
15
OPTIONS:
16
  --input PATH          Sets an input path
17
  --output-dir PATH     Sets an output path
18
";
19

            
20
#[derive(Debug)]
21
struct Args {
22
    input: PathBuf,
23
    output_dir: PathBuf,
24
}
25

            
26
12
fn parse_path(s: &std::ffi::OsStr) -> Result<std::path::PathBuf, &'static str> {
27
12
    Ok(s.into())
28
12
}
29

            
30
10
fn parse_args() -> Result<Args, pico_args::Error> {
31
10
    let mut pargs = pico_args::Arguments::from_env();
32
10

            
33
10
    // Help has a higher priority and should be handled separately.
34
10
    if pargs.contains(["-h", "--help"]) {
35
2
        print!("{}", HELP);
36
2
        std::process::exit(0);
37
8
    }
38
6
    let args = Args {
39
8
        input: pargs.value_from_os_str("--input", parse_path)?,
40
6
        output_dir: pargs.value_from_os_str("--output-dir", parse_path)?,
41
    };
42
6
    let remaining_arguments = pargs.finish();
43
6
    if !remaining_arguments.is_empty() {
44
2
        eprintln!("There are unused arguments:");
45
4
        for remaining in remaining_arguments {
46
2
            if let Ok(remaining) = remaining.into_string() {
47
2
                eprintln!("Unused argument: {}", remaining);
48
2
            }
49
        }
50
2
        print!("{}", HELP);
51
2
        std::process::exit(1);
52
4
    }
53
4
    Ok(args)
54
6
}
55

            
56
10
fn main() {
57
10
    let args = match parse_args() {
58
8
        Ok(v) => v,
59
2
        Err(e) => {
60
2
            eprintln!("Error: {}.", e);
61
2
            std::process::exit(1);
62
        }
63
    };
64
8
    harvest(&args.input, &args.output_dir);
65
8
}