| 22 | } |
| 23 | |
| 24 | func (msg DynamicMessage) Encode() []byte { |
| 25 | en := encoder{} |
| 26 | |
| 27 | // sort all items |
| 28 | type pair struct { |
| 29 | key uint64 |
| 30 | value any |
| 31 | } |
| 32 | all := make([]pair, 0, len(msg)) |
| 33 | for k, v := range msg { |
| 34 | all = append(all, pair{key: k, value: v}) |
| 35 | } |
| 36 | sort.Slice(all, func(i, j int) bool { |
| 37 | return all[i].key < all[j].key |
| 38 | }) |
| 39 | |
| 40 | //nolint:staticcheck |
| 41 | for _, item := range all { |
| 42 | key := item.key << 3 |
| 43 | switch v := item.value.(type) { |
| 44 | case bool: |
| 45 | en.uvarint(key) |
| 46 | vi := uint64(0) |
| 47 | if v { |
| 48 | vi = 1 |
| 49 | } |
| 50 | en.uvarint(vi) |
| 51 | case int: |
| 52 | en.uvarint(key) |
| 53 | en.uvarint(uint64(v)) |
| 54 | case uint: |
| 55 | en.uvarint(key) |
| 56 | en.uvarint(uint64(v)) |
| 57 | case int32: |
| 58 | en.uvarint(key) |
| 59 | en.uvarint(uint64(v)) |
| 60 | case int64: |
| 61 | en.uvarint(key) |
| 62 | en.uvarint(uint64(v)) |
| 63 | case uint32: |
| 64 | en.uvarint(key) |
| 65 | en.uvarint(uint64(v)) |
| 66 | case uint64: |
| 67 | en.uvarint(key) |
| 68 | en.uvarint(v) |
| 69 | case SInt: |
| 70 | en.uvarint(key) |
| 71 | en.svarint(int64(v)) |
| 72 | case SInt32: |
| 73 | en.uvarint(key) |
| 74 | en.svarint(int64(v)) |
| 75 | case SInt64: |
| 76 | en.uvarint(key) |
| 77 | en.svarint(int64(v)) |
| 78 | case float32: |
| 79 | en.uvarint(key | 5) |
| 80 | en.u32(math.Float32bits(v)) |
| 81 | case float64: |