File size: 1,705 Bytes
ca7217f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | package maps
import (
"bytes"
"encoding/json"
"iter"
"github.com/elliotchance/orderedmap/v3"
jsoniter "github.com/json-iterator/go"
)
var (
_ json.Marshaler = (*OrderedMap[int, any])(nil)
_ json.Unmarshaler = (*OrderedMap[int, any])(nil)
)
type OrderedMap[K comparable, V any] struct {
*orderedmap.OrderedMap[K, V]
escapeHTML bool
}
func NewOrderedMap[K comparable, V any]() *OrderedMap[K, V] {
return &OrderedMap[K, V]{OrderedMap: orderedmap.NewOrderedMap[K, V]()}
}
func (m *OrderedMap[K, V]) SetEscapeHTML(on bool) {
m.escapeHTML = on
}
func (m *OrderedMap[K, V]) Copy() *OrderedMap[K, V] {
return &OrderedMap[K, V]{
OrderedMap: m.OrderedMap.Copy(),
escapeHTML: m.escapeHTML,
}
}
func (m *OrderedMap[K, V]) Iterator() iter.Seq2[K, V] {
return m.AllFromFront() // For compatibility.
}
func (m *OrderedMap[K, V]) MarshalJSON() ([]byte, error) {
buf := bytes.NewBuffer(nil)
buf.WriteByte('{')
enc := json.NewEncoder(buf)
enc.SetEscapeHTML(m.escapeHTML)
for el := m.Front(); el != nil; el = el.Next() {
if el != m.Front() {
buf.WriteByte(',')
}
// add key
if err := enc.Encode(el.Key); err != nil {
return nil, err
}
buf.WriteByte(':')
// add value
if err := enc.Encode(el.Value); err != nil {
return nil, err
}
}
buf.WriteByte('}')
return buf.Bytes(), nil
}
func (m *OrderedMap[K, V]) UnmarshalJSON(data []byte) error {
if m.OrderedMap == nil {
m.OrderedMap = orderedmap.NewOrderedMap[K, V]()
}
temp := make(map[K]V)
defer clear(temp) // for gc
if err := json.Unmarshal(data, &temp); err != nil {
return err
}
root := jsoniter.Get(data)
for _, key := range root.Keys() {
k := any(key).(K)
m.Set(k, temp[k])
}
return nil
}
|