1 // SPDX-FileCopyrightText: 2020 Robin Krahl <[email protected]>
2 // SPDX-License-Identifier: CC0-1.0
3 
4 use merge::Merge;
5 use serde::Deserialize;
6 use structopt::StructOpt;
7 
8 #[derive(Debug, Default, Deserialize, Merge, StructOpt)]
9 #[serde(default)]
10 struct Args {
11     #[structopt(short, long)]
12     #[merge(strategy = merge::bool::overwrite_false)]
13     debug: bool,
14 
15     input: Option<String>,
16 
17     output: Option<String>,
18 }
19 
get_config() -> Option<Args>20 fn get_config() -> Option<Args> {
21     let path: &std::path::Path = "args.toml".as_ref();
22     if path.is_file() {
23         let s = std::fs::read_to_string(path).expect("Could not read configuration file");
24         Some(toml::from_str(&s).expect("Could not parse configuration"))
25     } else {
26         None
27     }
28 }
29 
get_env() -> Args30 fn get_env() -> Args {
31     envy::prefixed("ARGS_")
32         .from_env()
33         .expect("Could not read environment variables")
34 }
35 
main()36 fn main() {
37     let mut args = Args::from_args();
38     args.merge(get_env());
39     if let Some(config) = get_config() {
40         args.merge(config);
41     }
42     println!("{:?}", args);
43 }
44