internal/settings/settings.go (46 lines of code) (raw):

package settings import ( "encoding/json" "github.com/pkg/errors" ) type SettingsCommon struct { PublicSettingsRaw interface{} `json:"publicSettings"` PublicSettings map[string]interface{} `json:"-"` ProtectedSettingsBase64 string `json:"protectedSettings"` SettingsCertThumbprint string `json:"protectedSettingsCertThumbprint"` SeqNo *int `json:"seqNo"` ExtensionName *string `json:"extensionName"` ExtensionState *string `json:"extensionState"` } func (li *SettingsCommon) UnmarshalJSON(data []byte) error { type localItem SettingsCommon var loc localItem if err := json.Unmarshal(data, &loc); err != nil { return err } *li = SettingsCommon(loc) switch li.PublicSettingsRaw.(type) { case string: // When a string type is found, we need to attempt an extra parsing step. // This is needed to handle the response from the VMSettings API for immediate run command publicSettingsRawString := li.PublicSettingsRaw.(string) var publicSettings map[string]interface{} if publicSettingsRawString != "" { if err := json.Unmarshal([]byte(publicSettingsRawString), &publicSettings); err != nil { return errors.Wrapf(err, "failed to parse public settings from json") } } li.PublicSettings = publicSettings case interface{}: // This covers the scenario to parse the settings for a normal run command request li.PublicSettings = li.PublicSettingsRaw.(map[string]interface{}) } return nil } func (li SettingsCommon) MarshalJSON() ([]byte, error) { type SettingsCommonHelper SettingsCommon s := SettingsCommonHelper(li) publicSettingsRaw, err := json.Marshal(s.PublicSettings) if err != nil { return []byte{}, errors.Wrap(err, "could not marshal public settings") } s.PublicSettingsRaw = string(publicSettingsRaw) return json.Marshal(s) }