github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/syft/pkg/key_value.go (about) 1 package pkg 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "sort" 7 ) 8 9 type KeyValue struct { 10 Key string `json:"key"` 11 Value string `json:"value"` 12 } 13 14 type KeyValues []KeyValue 15 16 func (k KeyValues) Get(key string) (string, bool) { 17 for _, kv := range k { 18 if kv.Key == key { 19 return kv.Value, true 20 } 21 } 22 23 return "", false 24 } 25 26 func (k KeyValues) MustGet(key string) string { 27 for _, kv := range k { 28 if kv.Key == key { 29 return kv.Value 30 } 31 } 32 33 return "" 34 } 35 36 func keyValuesFromMap(m map[string]string) KeyValues { 37 var result KeyValues 38 var mapKeys []string 39 for k := range m { 40 mapKeys = append(mapKeys, k) 41 } 42 sort.Strings(mapKeys) 43 for _, k := range mapKeys { 44 result = append(result, KeyValue{ 45 Key: k, 46 Value: m[k], 47 }) 48 } 49 return result 50 } 51 52 func (k *KeyValues) UnmarshalJSON(b []byte) error { 53 var kvs []KeyValue 54 if err := json.Unmarshal(b, &kvs); err != nil { 55 var legacyMap map[string]string 56 if err := json.Unmarshal(b, &legacyMap); err != nil { 57 return fmt.Errorf("unable to unmarshal KeyValues: %w", err) 58 } 59 var keys []string 60 for k := range legacyMap { 61 keys = append(keys, k) 62 } 63 sort.Strings(keys) 64 for _, k := range keys { 65 kvs = append(kvs, KeyValue{Key: k, Value: legacyMap[k]}) 66 } 67 } 68 *k = kvs 69 return nil 70 }