summaryrefslogtreecommitdiffstats
path: root/crates/core/tedge/src/cli/config/config_key.rs
blob: 9622726957c6b61789b925d0fff7f06506f48c98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use std::str::FromStr;
use tedge_config::*;

/// Wrapper type for configuration keys.
///
/// This is used to reject invalid config keys during CLI parsing.
pub struct ConfigKey {
    pub key: &'static str,
    pub description: &'static str,
    pub get: GetConfigStringValue<TEdgeConfig>,
    pub set: SetConfigStringValue<TEdgeConfig>,
    pub unset: UnsetConfigValue<TEdgeConfig>,
}

type GetConfigStringValue<C> = Box<dyn Fn(&C) -> ConfigSettingResult<String>>;
type SetConfigStringValue<C> = Box<dyn Fn(&mut C, String) -> ConfigSettingResult<()>>;
type UnsetConfigValue<C> = Box<dyn Fn(&mut C) -> ConfigSettingResult<()>>;

impl std::fmt::Debug for ConfigKey {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "ConfigKey({})", self.key)
    }
}

macro_rules! config_key {
    ($setting:tt) => {
        ConfigKey {
            key: $setting::KEY,
            description: $setting::DESCRIPTION,
            get: Box::new(move |config: &TEdgeConfig| config.query_string($setting)),
            set: Box::new(move |config: &mut TEdgeConfig, value: String| {
                config.update_string($setting, value)
            }),
            unset: Box::new(move |config: &mut TEdgeConfig| config.unset($setting)),
        }
    };
}

impl ConfigKey {
    pub fn list_all() -> Vec<ConfigKey> {
        vec![
            config_key!(DeviceIdSetting),
            config_key!(DeviceTypeSetting),
            config_key!(DeviceKeyPathSetting),
            config_key!(DeviceCertPathSetting),
            config_key!(C8yUrlSetting),
            config_key!(C8yRootCertPathSetting),
            config_key!(AzureUrlSetting),
            config_key!(AzureRootCertPathSetting),
            config_key!(AzureMapperTimestamp),
            config_key!(MqttBindAddressSetting),
            config_key!(MqttPortSetting),
            config_key!(MqttExternalPortSetting),
            config_key!(MqttExternalBindAddressSetting),
            config_key!(MqttExternalBindInterfaceSetting),
            config_key!(MqttExternalCAPathSetting),
            config_key!(MqttExternalCertfileSetting),
            config_key!(MqttExternalKeyfileSetting),
            config_key!(SoftwarePluginDefaultSetting),
            config_key!(TmpPathSetting),
            config_key!(LogPathSetting),
            config_key!(RunPathSetting),
        ]
    }
}

impl FromStr for ConfigKey {
    type Err = String;

    fn from_str(key: &str) -> Result<Self, Self::Err> {
        ConfigKey::list_all()
            .into_iter()
            .find(|config_key| config_key.key == key)
            .ok_or_else(|| {
                format!(
                    "Invalid key `{}'. See `tedge config list --doc` for a list of valid keys.",
                    key,
                )
            })
    }
}