|
1 | 1 | package utility |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "cmp" |
4 | 5 | "encoding/json" |
5 | 6 | "fmt" |
6 | 7 | "reflect" |
7 | 8 | "regexp" |
| 9 | + "slices" |
8 | 10 |
|
9 | 11 | "google.golang.org/protobuf/encoding/protojson" |
10 | 12 | "google.golang.org/protobuf/proto" |
@@ -57,9 +59,15 @@ func IsRepoURL(url string) bool { |
57 | 59 | // which is suitable for OSV's database_specific field. |
58 | 60 | func NewStructpbFromMap(v map[string]any) (*structpb.Struct, error) { |
59 | 61 | x := &structpb.Struct{Fields: make(map[string]*structpb.Value, len(v))} |
60 | | - for k, v := range v { |
| 62 | + keys := make([]string, 0, len(v)) |
| 63 | + for k := range v { |
| 64 | + keys = append(keys, k) |
| 65 | + } |
| 66 | + slices.Sort(keys) |
| 67 | + |
| 68 | + for _, k := range keys { |
61 | 69 | var err error |
62 | | - x.Fields[k], err = newStructpbValue(v) |
| 70 | + x.Fields[k], err = newStructpbValue(v[k]) |
63 | 71 | if err != nil { |
64 | 72 | return nil, err |
65 | 73 | } |
@@ -94,16 +102,21 @@ func newStructpbValue(v any) (*structpb.Value, error) { |
94 | 102 | return structpbValueFromList(anyList) |
95 | 103 | case reflect.Map: |
96 | 104 | if val.Type().Key().Kind() == reflect.String { |
97 | | - m := make(map[string]any) |
98 | | - for _, k := range val.MapKeys() { |
99 | | - m[k.String()] = val.MapIndex(k).Interface() |
100 | | - } |
101 | | - structpbMap, err := NewStructpbFromMap(m) |
102 | | - if err != nil { |
103 | | - return nil, err |
| 105 | + keys := val.MapKeys() |
| 106 | + slices.SortFunc(keys, func(a, b reflect.Value) int { |
| 107 | + return cmp.Compare(a.String(), b.String()) |
| 108 | + }) |
| 109 | + |
| 110 | + x := &structpb.Struct{Fields: make(map[string]*structpb.Value, len(keys))} |
| 111 | + for _, k := range keys { |
| 112 | + var err error |
| 113 | + x.Fields[k.String()], err = newStructpbValue(val.MapIndex(k).Interface()) |
| 114 | + if err != nil { |
| 115 | + return nil, err |
| 116 | + } |
104 | 117 | } |
105 | 118 |
|
106 | | - return structpb.NewStructValue(structpbMap), nil |
| 119 | + return structpb.NewStructValue(x), nil |
107 | 120 | } |
108 | 121 |
|
109 | 122 | return structpb.NewValue(v) |
|
0 commit comments