mirror of
https://github.com/lukaszraczylo/go-simple-graphql.git
synced 2026-10-13 00:48:37 +00:00
65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
package ordered_map
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
jsoniter "github.com/json-iterator/go"
|
|
)
|
|
|
|
var json = jsoniter.ConfigCompatibleWithStandardLibrary
|
|
|
|
type OrderedMap struct {
|
|
values map[string]interface{}
|
|
keys []string
|
|
}
|
|
|
|
func New() *OrderedMap {
|
|
o := OrderedMap{}
|
|
o.keys = []string{}
|
|
o.values = map[string]interface{}{}
|
|
return &o
|
|
}
|
|
|
|
func (o *OrderedMap) Set(key string, value interface{}) {
|
|
_, exists := o.values[key]
|
|
if !exists {
|
|
o.keys = append(o.keys, key)
|
|
}
|
|
o.values[key] = value
|
|
}
|
|
|
|
func (o OrderedMap) MarshalJSON() ([]byte, error) {
|
|
var buf bytes.Buffer
|
|
buf.WriteByte('{')
|
|
encoder := json.NewEncoder(&buf)
|
|
encoder.SetEscapeHTML(false)
|
|
encoder.SetIndent("", "")
|
|
for i, k := range o.keys {
|
|
if i > 0 {
|
|
buf.WriteByte(',')
|
|
}
|
|
buf.WriteByte('"')
|
|
buf.WriteString(k)
|
|
buf.WriteString(`":`)
|
|
customEncoder := &customJsonEncoder{buf: &buf}
|
|
if err := customEncoder.Encode(o.values[k]); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
buf.WriteByte('}')
|
|
return buf.Bytes(), nil
|
|
}
|
|
|
|
type customJsonEncoder struct {
|
|
buf *bytes.Buffer
|
|
}
|
|
|
|
func (e *customJsonEncoder) Encode(v interface{}) error {
|
|
data, err := json.Marshal(v)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
e.buf.Write(data)
|
|
return nil
|
|
}
|