package osbuild2 import ( "bytes" "encoding/json" ) type CurlSource struct { Items map[string]CurlSourceItem `json:"items"` } func (CurlSource) isSource() {} // CurlSourceItem can be either a URL string or a URL paired with a secrets // provider type CurlSourceItem interface { isCurlSourceItem() } type URL string func (URL) isCurlSourceItem() {} type URLWithSecrets struct { URL string `json:"url"` Secrets *URLSecrets `json:"secrets,omitempty"` } func (URLWithSecrets) isCurlSourceItem() {} type URLSecrets struct { Name string `json:"name"` } // Unmarshal method for CurlSource for handling the CurlSourceItem interface: // Tries each of the implementations until it finds the one that works. func (cs *CurlSource) UnmarshalJSON(data []byte) (err error) { cs.Items = make(map[string]CurlSourceItem) type csSimple struct { Items map[string]URL `json:"items"` } simple := new(csSimple) b := bytes.NewReader(data) dec := json.NewDecoder(b) dec.DisallowUnknownFields() if err = dec.Decode(simple); err == nil { for k, v := range simple.Items { cs.Items[k] = v } return } type csWithSecrets struct { Items map[string]URLWithSecrets `json:"items"` } withSecrets := new(csWithSecrets) b.Reset(data) if err = dec.Decode(withSecrets); err == nil { for k, v := range withSecrets.Items { cs.Items[k] = v } return } return }