From 9d59cfb3b6e0b1f5393186ef6d599de09804d795 Mon Sep 17 00:00:00 2001 From: "5684185+vsariola@users.noreply.github.com" <5684185+vsariola@users.noreply.github.com> Date: Sat, 2 Nov 2024 22:01:12 +0200 Subject: [PATCH] fix(tracker): unmarshal always into fresh, empty structs A somewhat gotcha: when unmarshaling into &m.d with json.Unmarshal or yaml.Unmarshal, maps were "merged" with the existing maps, which is how we ended up with send units with color parameters, among other things. This fix always unmarshals into fresh var data modelData and only then sets m.d = data if the unmarshaling was succesful. --- tracker/model.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tracker/model.go b/tracker/model.go index 3d00b28..ad429f1 100644 --- a/tracker/model.go +++ b/tracker/model.go @@ -193,7 +193,10 @@ func NewModelPlayer(broker *Broker, synther sointu.Synther, midiContext MIDICont m.resetSong() if recoveryFilePath != "" { if bytes2, err := os.ReadFile(m.d.RecoveryFilePath); err == nil { - json.Unmarshal(bytes2, &m.d) + var data modelData + if json.Unmarshal(bytes2, &data) == nil { + m.d = data + } } } m.signalAnalyzer = NewScopeModel(broker, m.d.Song.BPM) @@ -326,13 +329,18 @@ func (m *Model) SaveRecovery() error { } func (m *Model) UnmarshalRecovery(bytes []byte) { - err := json.Unmarshal(bytes, &m.d) + var data modelData + err := json.Unmarshal(bytes, &data) if err != nil { return } + m.d = data if m.d.RecoveryFilePath != "" { // check if there's a recovery file on disk and load it instead if bytes2, err := os.ReadFile(m.d.RecoveryFilePath); err == nil { - json.Unmarshal(bytes2, &m.d) + var data modelData + if json.Unmarshal(bytes2, &data) == nil { + m.d = data + } } } m.d.ChangedSinceRecovery = false