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
8
fn parse_path(s: &std::ffi::OsStr) -> Result<std::path::PathBuf, &'static str> {
27
8
    Ok(s.into())
28
8
}
29

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

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

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