1use config::{Config, ConfigError, File};
2use serde::{Deserialize, Serialize};
3use tracing::warn;
4
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
7#[allow(unused)]
8pub struct Network {
9 pub port: u16,
10 pub address: String,
11}
12
13#[derive(Debug, Clone, Serialize, Deserialize)]
14#[allow(unused)]
15pub struct Plugins {
16 pub folder: String,
17 pub names: Vec<String>,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
21#[allow(unused)]
22pub struct Settings {
23 pub network: Network,
24 pub plugins: Plugins,
25}
26
27impl Settings {
28 #[must_use]
29 pub fn new(config_file_name: &Option<String>) -> Self {
30 let default_settings = Self::default();
31 let from_file = Self::new_from_default(&default_settings, config_file_name);
32 match from_file {
33 Ok(f) => f,
34 Err(e) => {
35 warn!("Error reading config file ({:?})", e);
36 default_settings
37 }
38 }
39 }
40
41 fn new_from_default(default: &Settings, config_file_name: &Option<String>) -> Result<Self, ConfigError> {
42 let default_config_file_name = "config.toml".to_string();
43 let config_file: String = match config_file_name {
44 Some(value) => value.to_owned(),
45 None => default_config_file_name
46 };
47 let builder = Config::builder();
48 let def = Config::try_from(default)?;
49 let our = File::with_name(&config_file);
50 let config = builder
51 .add_source(def)
52 .add_source(our)
53 .build()?;
54
55 let settings: Settings = config.try_deserialize()?;
56
57 Ok(settings)
58 }
59}
60
61impl Default for Settings {
62 fn default() -> Self {
63 Settings {
64 network: Network {
65 port: 50051,
66 address: "0.0.0.0".to_owned(),
67 },
68 plugins: Plugins {
69 folder: "plugins".to_owned(),
70 names: vec![],
71 },
72 }
73 }
74}