raspberry_web/
settings.rs

1use clap::ArgMatches;
2use config::{Config, ConfigError, File};
3
4// https://github.com/mehcode/config-rs/tree/master/examples/hierarchical-env
5#[derive(Debug, Serialize, Deserialize)]
6pub struct Webserver {
7    pub hostname: String,
8    pub port: i32,
9}
10
11#[derive(Debug, Serialize, Deserialize)]
12pub struct Database {
13    pub database_url: String,
14}
15
16#[derive(Debug, Serialize, Deserialize)]
17pub struct GpioConfig {
18    pub gpios_in_use: Option<Vec<i32>>,
19    pub gpios_mode_output: Option<Vec<i32>>,
20    pub gpios_mode_input: Option<Vec<i32>>,
21    pub gpios_level_low: Option<Vec<i32>>,
22    pub gpios_level_high: Option<Vec<i32>>,
23}
24
25#[derive(Debug, Serialize, Deserialize)]
26pub struct Settings {
27    pub webserver: Webserver,
28    pub database: Database,
29    pub gpioconfig: GpioConfig,
30}
31
32impl Settings {
33    pub fn new(args: ArgMatches) -> Result<Self, ConfigError> {
34        let mut settings = Config::new();
35
36        // Configuration file for development
37        #[cfg(debug_assertions)]
38        let default_config_file = "config/dev-configuration.toml";
39
40        // Configuration file for installed binary
41        #[cfg(not(debug_assertions))]
42        let default_config_file = "/usr/local/raspberry-web/configuration.toml";
43
44        // Let user supply a config file, or use default
45        let config_file = args.value_of("config-file").unwrap_or(default_config_file);
46
47        settings.merge(File::with_name(config_file))?;
48        settings.try_into()
49    }
50}