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  }