diff --git a/change.go b/change.go index 95e7e462d02024af2b14bd9fd1c72bb39feb1278..df2b1bd2cc96382fef42b436671e66697a6028c4 100644 --- a/change.go +++ b/change.go @@ -7,25 +7,21 @@ import ( "github.com/r3labs/diff/v3" ) -func (s *Settings[C]) setConfigInternal(config C, lock bool) *Settings[C] { +func (s *Settings[C]) notifyHooks(changelog diff.Changelog) { - var ( - changelog diff.Changelog - err error - ) - - if lock { - s.Lock() + if len(changelog) > 0 { + s.notifyPostprocessingHooks(changelog) + s.notifyChangeHooks(changelog) } - defer func() { +} - if len(changelog) > 0 { - s.notifyPostprocessingHooks(changelog) - s.notifyChangeHooks(changelog) - } +func (s *Settings[C]) setConfigInternal(config C) (*Settings[C], diff.Changelog) { - }() + var ( + changelog diff.Changelog + err error + ) errorCount := len(s.errors) defer func() { @@ -34,21 +30,15 @@ func (s *Settings[C]) setConfigInternal(config C, lock bool) *Settings[C] { } }() - defer func() { - if lock { - s.Unlock() - } - }() - if err := validateConfig[C](config); err != nil { s.errors = append(s.errors, err) - return s + return s, changelog } d, err := diff.NewDiffer() if err != nil { s.errors = append(s.errors, err) - return s + return s, changelog } d.ConvertCompatibleTypes = true @@ -57,13 +47,19 @@ func (s *Settings[C]) setConfigInternal(config C, lock bool) *Settings[C] { changelog, err = d.Diff(s.config, config) if err != nil { s.errors = append(s.errors, err) - return s + return s, changelog } s.config = config - return s + return s, changelog } func (s *Settings[C]) SetConfig(config C) *Settings[C] { - return s.setConfigInternal(config, true) + s.Lock() + c, l := s.setConfigInternal(config) + s.Unlock() + + s.notifyHooks(l) + + return c } diff --git a/copyable.go b/copyable.go index b579e6d008f9d6875ca7065fb338832ef3c7be63..7a64e4b624df4de57d4f456fc5ae2b5469df1346 100644 --- a/copyable.go +++ b/copyable.go @@ -7,15 +7,14 @@ import ( "gitlab.schukai.com/oss/libraries/go/utilities/pathfinder" ) -// // Copy implements the xflags.Copyable interface. +// Copy implements the xflags.Copyable interface. func (s *Settings[C]) Copy(m map[string]any) { if s == nil { - panic("struct is not initialized") + panic("cannot copy nil") } s.Lock() - defer s.Unlock() errorCount := len(s.errors) defer func() { @@ -37,6 +36,9 @@ func (s *Settings[C]) Copy(m map[string]any) { } } - s.setConfigInternal(c, false) - + _, l := s.setConfigInternal(c) + s.Unlock() + + s.notifyHooks(l) + } diff --git a/devenv.nix b/devenv.nix index 2568f0c76e7a3ebc2003ee009c7d0bfa6dc3e41c..0eb76b3c2a096fae6bfa92afd944cbda0eeaae79 100644 --- a/devenv.nix +++ b/devenv.nix @@ -3,34 +3,34 @@ { # https://devenv.sh/packages/ - packages = [ + packages = with pkgs; [ inputs.version.defaultPackage."${builtins.currentSystem}" - pkgs.git - pkgs.gcc12 - pkgs.go-task - pkgs.blackbox - pkgs.blackbox-terminal - pkgs.jq - pkgs.delve - pkgs.gdlv - pkgs.wget - pkgs.glab - pkgs.unixtools.xxd - pkgs.libffi - pkgs.zlib - pkgs.procps - pkgs.php81Extensions.xdebug - pkgs.ranger - pkgs.meld - pkgs.gnused - pkgs.coreutils-full - pkgs.gnugrep - pkgs.gnumake - pkgs.util-linux - pkgs.httpie - pkgs.netcat - pkgs.memcached - pkgs.fd + git + gcc12 + go-task + blackbox + blackbox-terminal + jq + delve + gdlv + wget + glab + unixtools.xxd + libffi + zlib + procps + php81Extensions.xdebug + ranger + meld + gnused + coreutils-full + gnugrep + gnumake + util-linux + httpie + netcat + memcached + fd ]; @@ -65,7 +65,7 @@ PATH="''${PATH}":${pkgs.git}/bin/ PATH="''${PATH}":${pkgs.gnugrep}/bin/ PATH="''${PATH}":${inputs.version.defaultPackage."${builtins.currentSystem}"}/bin/ -export -f PATH +export PATH task test diff --git a/http-handler.go b/http-handler.go index c865f4289e8b923c21ce086b82b0dad6f64ed3dc..b7c2b71d1c31821e78f1a7fae35b0059fab63c0a 100644 --- a/http-handler.go +++ b/http-handler.go @@ -83,7 +83,6 @@ func (s *Settings[C]) servePost(w http.ResponseWriter, r *http.Request) { } s.Lock() - defer s.Unlock() b := s.config s.importStream(rs) @@ -91,7 +90,9 @@ func (s *Settings[C]) servePost(w http.ResponseWriter, r *http.Request) { x := s.config s.config = b - s.setConfigInternal(x, false) + _, l := s.setConfigInternal(x) + s.Unlock() + s.notifyHooks(l) } diff --git a/import.go b/import.go index 486f02b20da54e28e1c69387dc542e9ff8415d7f..f6162ef154771aa224fd90cb881906a269a20ea8 100644 --- a/import.go +++ b/import.go @@ -187,7 +187,6 @@ func (s *Settings[C]) importFiles() { func (s *Settings[C]) Import() *Settings[C] { s.Lock() - defer s.Unlock() errorCount := len(s.errors) defer func() { @@ -216,7 +215,9 @@ func (s *Settings[C]) Import() *Settings[C] { x := s.config s.config = defaults - s.setConfigInternal(x, false) + _, l := s.setConfigInternal(x) + s.Unlock() + s.notifyHooks(l) return s }