summaryrefslogtreecommitdiffstats
path: root/crates/common/tedge_config/src/config_setting.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/common/tedge_config/src/config_setting.rs')
-rw-r--r--crates/common/tedge_config/src/config_setting.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/crates/common/tedge_config/src/config_setting.rs b/crates/common/tedge_config/src/config_setting.rs
new file mode 100644
index 00000000..aa68d66a
--- /dev/null
+++ b/crates/common/tedge_config/src/config_setting.rs
@@ -0,0 +1,75 @@
+pub trait ConfigSetting {
+ /// This is something like `device.id`.
+ const KEY: &'static str;
+
+ const DESCRIPTION: &'static str;
+
+ /// The underlying value type of the configuration setting.
+ type Value;
+}
+
+pub trait ConfigSettingAccessor<T: ConfigSetting> {
+ /// Read a configuration setting
+ fn query(&self, setting: T) -> ConfigSettingResult<T::Value>;
+
+ fn query_optional(&self, setting: T) -> ConfigSettingResult<Option<T::Value>> {
+ match self.query(setting) {
+ Ok(value) => Ok(Some(value)),
+ Err(ConfigSettingError::ConfigNotSet { .. }) => Ok(None),
+ Err(err) => Err(err),
+ }
+ }
+
+ /// Update a configuration setting
+ fn update(&mut self, _setting: T, _value: T::Value) -> ConfigSettingResult<()>;
+
+ /// Unset a configuration setting / reset to default
+ fn unset(&mut self, _setting: T) -> ConfigSettingResult<()>;
+}
+
+/// Extension trait that provides methods to query a setting as a String or
+/// update a setting provided a String value.
+pub trait ConfigSettingAccessorStringExt<T: ConfigSetting>: ConfigSettingAccessor<T> {
+ /// Read a configuration setting and convert it into a String.
+ fn query_string(&self, setting: T) -> ConfigSettingResult<String>;
+
+ fn query_string_optional(&self, setting: T) -> ConfigSettingResult<Option<String>> {
+ match self.query_string(setting) {
+ Ok(value) => Ok(Some(value)),
+ Err(ConfigSettingError::ConfigNotSet { .. }) => Ok(None),
+ Err(err) => Err(err),
+ }
+ }
+
+ /// Update a configuration setting from a String value
+ fn update_string(&mut self, setting: T, value: String) -> ConfigSettingResult<()>;
+}
+
+pub type ConfigSettingResult<T> = Result<T, ConfigSettingError>;
+
+#[derive(thiserror::Error, Debug)]
+pub enum ConfigSettingError {
+ #[error(
+ r#"A value for `{key}` is missing.
+ A value can be set with `tedge config set {key} <value>`"#
+ )]
+ ConfigNotSet { key: &'static str },
+
+ #[error("Readonly setting: {message}")]
+ ReadonlySetting { message: &'static str },
+
+ #[error("Conversion from String failed")]
+ ConversionFromStringFailed,
+
+ #[error("Conversion into String failed")]
+ ConversionIntoStringFailed,
+
+ #[error("Derivation for `{key}` failed: {cause}")]
+ DerivationFailed { key: &'static str, cause: String },
+
+ #[error("Config value {key}, cannot be configured: {message} ")]
+ SettingIsNotConfigurable {
+ key: &'static str,
+ message: &'static str,
+ },
+}