package v01 import ( "encoding/json" "sync" patch "github.com/evanphx/json-patch/v5" ) type ( config struct { lock *sync.Mutex Feedback configFeedback Users map[string]configUser Players []configPlayer Quiet bool Broadcast configBroadcast GM configGM } configGM struct { Hotwords map[string]configGMHotword } configGMHotword struct { Call string Args []string } configBroadcast struct { Message string } configFeedback struct { Addr string TTSURL string } configUser struct { Meta configUserMeta State configUserState } configUserMeta struct { LastTSMS int64 LastLag int64 } configUserState struct { Player int Message string GM configUserStateGM } configUserStateGM struct { Alias string LastAlias string Vote string } configPlayer struct { Transformation transformation } ) func (cfg config) WithPatch(v interface{}) config { cfg.lock.Lock() defer cfg.lock.Unlock() originalData, _ := json.Marshal(cfg) patchData, _ := json.Marshal(v) patcher, err := patch.DecodePatch(patchData) if err != nil { return cfg } patchedData, err := patcher.Apply(originalData) if err != nil { return cfg } var patched config if err := json.Unmarshal(patchedData, &patched); err != nil { return cfg } return patched }