1
mod server;
2

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

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

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

            
33
    // Help has a higher priority and should be handled separately.
34
    if pargs.contains(["-h", "--help"]) {
35
        print!("{}", HELP);
36
        std::process::exit(0);
37
    }
38
    let args = Args {
39
        input: pargs.value_from_os_str("--input", parse_path)?,
40
        output_dir: pargs.value_from_os_str("--output-dir", parse_path)?,
41
    };
42
    let remaining_arguments = pargs.finish();
43
    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
    }
53
    Ok(args)
54
}
55

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