aboutsummaryrefslogtreecommitdiff
path: root/apps/koffice/invoice/src/cli.rs
blob: cbf27efe6cc46828cf362c6e8f49f9f0983658f6 (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
68
69
70
71
72
73
74
75
76
use crate::Meta;
use clap::{App, AppSettings, Arg, SubCommand};

pub struct AppState {
    pub meta: Meta,
    pub cmd: Command,
}

pub enum Command {
    Init,
    Generate,
    Install,
}

pub fn parse() -> AppState {
    let project_id =
        Arg::with_name("project id").help("The project identifier.  Format: [client/]<project>");

    let timefile = Arg::with_name("timefile")
        .help("Location of the project's time file")
        .takes_value(true)
        .long("file")
        .short("f")
        .default_value("./time.cass");

    let template = Arg::with_name("template")
        .help("Override the default application template")
        .long("templ")
        .short("t")
        .takes_value(true)
        .default_value("$XDG_CONFIG_HOME/k-office/template.tex");

    let revision = Arg::with_name("revision")
        .help("Override the default revision system")
        .long("rev")
        .short("r")
        .takes_value(true);

    let app = App::new("invoice")
        .version(env!("CARGO_PKG_VERSION"))
        .about("A k-office tool to generate and manage invoices")
        .settings(&[
            AppSettings::SubcommandRequired,
            AppSettings::GlobalVersion,
            AppSettings::ColoredHelp,
            AppSettings::DontCollapseArgsInUsage,
        ])
        .subcommand(
            SubCommand::with_name("init")
                .about("Initialise a new invoice config")
                .arg(timefile)
                .arg(revision.clone()),
        )
        .subcommand(
            SubCommand::with_name("generate")
                .about("Generate an invoice PDF for a client/ project based on a template")
                .arg(revision)
                .arg(template),
        );

    let matches = app.get_matches();

    let project_id = matches.value_of("project id");
    let timefile = matches.value_of("timefile");
    let template = matches.value_of("template");
    let revision = matches.value_of("revision");

    AppState {
        meta: crate::base::init(project_id, timefile, template, revision),
        cmd: match matches.subcommand() {
            ("init", _) => Command::Init,
            ("generate", _) => Command::Generate,
            _ => unreachable!(),
        },
    }
}