nostr_rs_ext/
config.rs

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}