File: args.rs

package info (click to toggle)
rust-merge 0.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 288 kB
  • sloc: makefile: 2
file content (46 lines) | stat: -rw-r--r-- 1,186 bytes parent folder | download
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
// SPDX-FileCopyrightText: 2020 Robin Krahl <robin.krahl@ireas.org>
// SPDX-License-Identifier: CC0-1.0
#![cfg(feature = "derive")]

use merge::Merge;
use serde::Deserialize;
use structopt::StructOpt;

#[derive(Debug, Default, Deserialize, Merge, StructOpt)]
#[serde(default)]
struct Args {
    #[structopt(short, long)]
    #[merge(strategy = merge::bool::overwrite_false)]
    debug: bool,

    #[merge(strategy = merge::option::overwrite_none)]
    input: Option<String>,

    #[merge(strategy = merge::option::overwrite_none)]
    output: Option<String>,
}

fn get_config() -> Option<Args> {
    let path: &std::path::Path = "args.toml".as_ref();
    if path.is_file() {
        let s = std::fs::read_to_string(path).expect("Could not read configuration file");
        Some(toml::from_str(&s).expect("Could not parse configuration"))
    } else {
        None
    }
}

fn get_env() -> Args {
    envy::prefixed("ARGS_")
        .from_env()
        .expect("Could not read environment variables")
}

fn main() {
    let mut args = Args::from_args();
    args.merge(get_env());
    if let Some(config) = get_config() {
        args.merge(config);
    }
    println!("{:?}", args);
}