1
mod server;
2
use review_harvest::index::{check_index, read_entries, write_index};
3
use std::{error::Error, path::PathBuf};
4

            
5
const HELP: &str = "\
6
update_ldpc
7

            
8
USAGE:
9
  update_ldpc DIR
10

            
11
FLAGS:
12
  -h, --help            Prints help information
13
";
14

            
15
#[derive(Debug)]
16
struct Args {
17
    dir: PathBuf,
18
}
19

            
20
12
fn parse_path(s: &std::ffi::OsStr) -> Result<std::path::PathBuf, &'static str> {
21
12
    Ok(s.into())
22
12
}
23

            
24
16
fn parse_args() -> Result<Args, pico_args::Error> {
25
16
    let mut pargs = pico_args::Arguments::from_env();
26
16

            
27
16
    // Help has a higher priority and should be handled separately.
28
16
    if pargs.contains(["-h", "--help"]) {
29
2
        print!("{}", HELP);
30
2
        std::process::exit(0);
31
14
    }
32
12
    let args = Args {
33
14
        dir: pargs.free_from_os_str(parse_path)?,
34
    };
35
12
    let remaining_arguments = pargs.finish();
36
12
    if !remaining_arguments.is_empty() {
37
2
        eprintln!("There are unused arguments:");
38
4
        for remaining in remaining_arguments {
39
2
            if let Ok(remaining) = remaining.into_string() {
40
2
                eprintln!("Unused argument: {}", remaining);
41
2
            }
42
        }
43
2
        eprint!("{}", HELP);
44
2
        std::process::exit(1);
45
10
    }
46
10

            
47
10
    Ok(args)
48
12
}
49

            
50
16
fn main() -> Result<(), Box<dyn Error>> {
51
16
    let args = match parse_args() {
52
14
        Ok(v) => v,
53
2
        Err(e) => {
54
2
            eprintln!("Error: {}.", e);
55
2
            eprint!("{}", HELP);
56
2
            std::process::exit(1);
57
        }
58
    };
59
14
    let dir = &args.dir;
60
14
    let entries = read_entries(dir)?;
61
6
    write_index(dir, &entries)?;
62
6
    check_index(dir)?;
63
2
    Ok(())
64
10
}