From b2963c78a6c41894eb594a1fa985d1631eb210d2 Mon Sep 17 00:00:00 2001
From: librelois <elois@ifee.fr>
Date: Mon, 27 Jan 2020 20:37:38 +0100
Subject: [PATCH] [feat] conf: load nested struct resources_usage from env vars

---
 lib/core/conf/src/env.rs                 | 27 +++++++++++++++++++-----
 lib/core/conf/src/resources.rs           | 24 ++++++++++-----------
 lib/core/conf/test/v1/conf-upgraded.json |  8 +++----
 lib/core/conf/test/v1/conf.json          |  8 +++----
 lib/core/conf/test/v2/conf.json          |  8 +++----
 5 files changed, 46 insertions(+), 29 deletions(-)

diff --git a/lib/core/conf/src/env.rs b/lib/core/conf/src/env.rs
index 27c2e099..8ca114ed 100644
--- a/lib/core/conf/src/env.rs
+++ b/lib/core/conf/src/env.rs
@@ -19,6 +19,7 @@ use crate::constants;
 use crate::errors::DursConfEnvError;
 use crate::global_conf::v2::DuRsGlobalUserConfV2;
 use crate::global_conf::DuRsGlobalUserConf;
+use crate::resources::ResourcesUsage;
 
 /// Load global user configuration from environment variables
 pub fn load_env_global_user_conf() -> Result<DuRsGlobalUserConf, DursConfEnvError> {
@@ -27,11 +28,17 @@ pub fn load_env_global_user_conf() -> Result<DuRsGlobalUserConf, DursConfEnvErro
             .parse::<usize>()
             .map_err(DursConfEnvError::ConfVersionParseErr)?
         {
-            2 => Ok(DuRsGlobalUserConf::V2(
-                envy::prefixed(constants::DURS_ENV_PREFIX)
+            2 => {
+                let resources_usage =
+                    envy::prefixed(&format!("{}RESOURCES_USAGE_", constants::DURS_ENV_PREFIX))
+                        .from_env::<ResourcesUsage>()
+                        .map_err(DursConfEnvError::EnvyErr)?;
+                let mut global_user_conf_v2 = envy::prefixed(constants::DURS_ENV_PREFIX)
                     .from_env::<DuRsGlobalUserConfV2>()
-                    .map_err(DursConfEnvError::EnvyErr)?,
-            )),
+                    .map_err(DursConfEnvError::EnvyErr)?;
+                global_user_conf_v2.resources_usage = Some(resources_usage);
+                Ok(DuRsGlobalUserConf::V2(global_user_conf_v2))
+            }
             v => Err(DursConfEnvError::UnsupportedVersion {
                 expected: vec![2],
                 found: v,
@@ -46,6 +53,7 @@ pub fn load_env_global_user_conf() -> Result<DuRsGlobalUserConf, DursConfEnvErro
 mod tests {
 
     use super::*;
+    use crate::resources::ResourceUsage;
     use dubp_currency_params::CurrencyName;
     use durs_module::ModuleName;
     use maplit::hashset;
@@ -92,13 +100,22 @@ mod tests {
             &format!("{}DISABLED", constants::DURS_ENV_PREFIX),
             "tui,gva",
         );
+        std::env::set_var(
+            &format!("{}RESOURCES_USAGE_MEMORY_USAGE", constants::DURS_ENV_PREFIX),
+            "medium",
+        );
 
         assert_eq!(
             DuRsGlobalUserConf::V2(DuRsGlobalUserConfV2 {
                 currency: Some(CurrencyName(String::from("g1"))),
                 my_node_id: None,
                 default_sync_module: None,
-                ressources_usage: None,
+                resources_usage: Some(ResourcesUsage {
+                    cpu_usage: ResourceUsage::Large,
+                    network_usage: ResourceUsage::Large,
+                    memory_usage: ResourceUsage::Medium,
+                    disk_space_usage: ResourceUsage::Large,
+                }),
                 disabled: Some(hashset![
                     ModuleName("tui".to_owned()),
                     ModuleName("gva".to_owned())
diff --git a/lib/core/conf/src/resources.rs b/lib/core/conf/src/resources.rs
index 75a1e84c..5bcffbb5 100644
--- a/lib/core/conf/src/resources.rs
+++ b/lib/core/conf/src/resources.rs
@@ -17,6 +17,7 @@
 
 #[derive(Debug, Copy, Clone, Deserialize, PartialEq, Serialize)]
 /// Ressource usage
+#[serde(rename_all = "lowercase")]
 pub enum ResourceUsage {
     /// Minimal use of the resource, to the detriment of performance
     Minimal,
@@ -28,26 +29,25 @@ pub enum ResourceUsage {
     Infinite,
 }
 
-#[derive(Debug, Copy, Clone, Deserialize, PartialEq, Serialize)]
+impl Default for ResourceUsage {
+    fn default() -> Self {
+        ResourceUsage::Large
+    }
+}
+
+#[derive(Debug, Default, Copy, Clone, Deserialize, PartialEq, Serialize)]
 /// Ressources usage
 pub struct ResourcesUsage {
     /// Cpu usage
+    #[serde(default)]
     pub cpu_usage: ResourceUsage,
     /// Network usage
+    #[serde(default)]
     pub network_usage: ResourceUsage,
     /// Memory usage
+    #[serde(default)]
     pub memory_usage: ResourceUsage,
     /// Disk space usage
+    #[serde(default)]
     pub disk_space_usage: ResourceUsage,
 }
-
-impl Default for ResourcesUsage {
-    fn default() -> Self {
-        ResourcesUsage {
-            cpu_usage: ResourceUsage::Large,
-            network_usage: ResourceUsage::Large,
-            memory_usage: ResourceUsage::Large,
-            disk_space_usage: ResourceUsage::Large,
-        }
-    }
-}
diff --git a/lib/core/conf/test/v1/conf-upgraded.json b/lib/core/conf/test/v1/conf-upgraded.json
index 1ac7a1f9..8b8be95f 100644
--- a/lib/core/conf/test/v1/conf-upgraded.json
+++ b/lib/core/conf/test/v1/conf-upgraded.json
@@ -5,10 +5,10 @@
       "my_node_id": 1191678020,
       "default_sync_module": "ws2p1",
       "resources_usage": {
-        "cpu_usage": "Large",
-        "network_usage": "Large",
-        "memory_usage": "Large",
-        "disk_space_usage": "Large"
+        "cpu_usage": "large",
+        "network_usage": "large",
+        "memory_usage": "large",
+        "disk_space_usage": "large"
       },
       "disabled": [],
       "enabled": []
diff --git a/lib/core/conf/test/v1/conf.json b/lib/core/conf/test/v1/conf.json
index 1ac7a1f9..8b8be95f 100644
--- a/lib/core/conf/test/v1/conf.json
+++ b/lib/core/conf/test/v1/conf.json
@@ -5,10 +5,10 @@
       "my_node_id": 1191678020,
       "default_sync_module": "ws2p1",
       "resources_usage": {
-        "cpu_usage": "Large",
-        "network_usage": "Large",
-        "memory_usage": "Large",
-        "disk_space_usage": "Large"
+        "cpu_usage": "large",
+        "network_usage": "large",
+        "memory_usage": "large",
+        "disk_space_usage": "large"
       },
       "disabled": [],
       "enabled": []
diff --git a/lib/core/conf/test/v2/conf.json b/lib/core/conf/test/v2/conf.json
index c80ab0a9..e69d96e0 100644
--- a/lib/core/conf/test/v2/conf.json
+++ b/lib/core/conf/test/v2/conf.json
@@ -5,10 +5,10 @@
             "my_node_id": 1191678020,
             "default_sync_module": "ws2pv1",
             "resources_usage": {
-                "cpu_usage": "Large",
-                "network_usage": "Large",
-                "memory_usage": "Large",
-                "disk_space_usage": "Large"
+                "cpu_usage": "large",
+                "network_usage": "large",
+                "memory_usage": "large",
+                "disk_space_usage": "large"
             },
             "disabled": [],
             "enabled": []
-- 
GitLab