From 82d0b952d9d3f059fe4bdf4a0f5b5e043b2aa4fb Mon Sep 17 00:00:00 2001
From: Mauco03 <marco.gaibotti@skywarder.eu>
Date: Sat, 23 Nov 2024 21:15:47 +0100
Subject: [PATCH] [design-updates] Converted merge method to read

The merge method was made to merge two different Settings classes
The read method can read from any struct
---
 classes/Settings.m | 44 ++++++++++++++++++++++++++++++--------------
 1 file changed, 30 insertions(+), 14 deletions(-)

diff --git a/classes/Settings.m b/classes/Settings.m
index b24a7e7..88b8a16 100644
--- a/classes/Settings.m
+++ b/classes/Settings.m
@@ -37,28 +37,44 @@ classdef Settings < Config & dynamicprops
             varsIn = obj.getConfig(configNames);
             obj.loadConfig(varsIn);
         end
+    end
 
-        function merge(target, source)
+    methods(Static)
+        function target = read(target, source, targetFields)
             arguments
-                target
-                source
+                target      {mustBeA(target, {'struct', 'Settings'})}
+                source      struct
+            end
+
+            arguments (Repeating)
+                targetFields {mustBeA(targetFields, {'char', 'string'})}
             end
-            % MERGE - merges two settings classes
-            %   Priority is given to the source settings
-            %   empty fields are ignored
+            % MERGE - reads and applies data from a source struct
+            %   Usage: settings.read(<struct>, <name of settings field>)
+            %
+            %   Source fields have priority over settings fields, meaning
+            %   the source will overwrite existing settings with the same
+            %   name
+            %
+            %   Empty fields in the source struct are ignored
 
             fields = fieldnames(source)';
+            if isempty(fields), return; end
+
+            if length(targetFields) > 1
+                target.(targetFields{1}) = Settings.read( ...
+                    target.(targetFields{1}), ...
+                    source, ...
+                    targetFields{2:end});
+                return;
+            end
+
+            % WIP: fix wrong assignment
+            targetField = targetFields{1};
             for field = fields
                 fd = field{1};
                 if isempty(source.(fd)), continue; end
-                if isempty(findprop(target, fd))
-                    target.addprop(fd);
-                    target.(fd) = source.(fd);
-                elseif isa(source.(fd), 'Settings')
-                    target.(fd).merge(source.(fd))
-                else
-                    target.(fd) = source.(fd);
-                end
+                target.(targetField).(fd) = source.(fd);
             end
         end
     end
-- 
GitLab