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>20fn 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() -> Args30fn get_env() -> Args { 31 envy::prefixed("ARGS_") 32 .from_env() 33 .expect("Could not read environment variables") 34 } 35 main()36fn 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