1
1
package collections
2
2
3
3
import (
4
- "bytes"
5
4
"encoding"
6
- "encoding/json"
7
5
"errors"
8
- "fmt"
9
6
"iter"
10
7
"maps"
11
8
"reflect"
12
9
"slices"
13
10
"strconv"
14
11
15
- json2 "github.com/go-json-experiment/json"
16
12
"github.com/go-json-experiment/json/jsontext"
13
+ "github.com/microsoft/typescript-go/internal/json"
17
14
)
18
15
19
16
// OrderedMap is an insertion ordered map.
@@ -203,37 +200,30 @@ func (m *OrderedMap[K, V]) clone() OrderedMap[K, V] {
203
200
}
204
201
}
205
202
206
- func (m * OrderedMap [K , V ]) MarshalJSON () ([]byte , error ) {
207
- if len (m .mp ) == 0 {
208
- return []byte ("{}" ), nil
203
+ var _ json.MarshalerTo = (* OrderedMap [string , string ])(nil )
204
+
205
+ func (m * OrderedMap [K , V ]) MarshalJSONTo (enc * jsontext.Encoder ) error {
206
+ if err := enc .WriteToken (jsontext .BeginObject ); err != nil {
207
+ return err
209
208
}
210
- var buf bytes.Buffer
211
- buf .WriteByte ('{' )
212
- enc := json .NewEncoder (& buf )
213
- enc .SetEscapeHTML (false )
214
-
215
- for i , k := range m .keys {
216
- if i > 0 {
217
- buf .WriteByte (',' )
218
- }
219
209
210
+ for _ , k := range m .keys {
211
+ // TODO: is this needed? Can we just MarshalEncode k directly?
220
212
keyString , err := resolveKeyName (reflect .ValueOf (k ))
221
213
if err != nil {
222
- return nil , err
214
+ return err
223
215
}
224
216
225
- if err := enc . Encode ( keyString ); err != nil {
226
- return nil , err
217
+ if err := json . MarshalEncode ( enc , keyString ); err != nil {
218
+ return err
227
219
}
228
220
229
- buf .WriteByte (':' )
230
-
231
- if err := enc .Encode (m .mp [k ]); err != nil {
232
- return nil , err
221
+ if err := json .MarshalEncode (enc , m .mp [k ]); err != nil {
222
+ return err
233
223
}
234
224
}
235
- buf . WriteByte ( '}' )
236
- return buf . Bytes (), nil
225
+
226
+ return enc . WriteToken ( jsontext . EndObject )
237
227
}
238
228
239
229
func resolveKeyName (k reflect.Value ) (string , error ) {
@@ -256,50 +246,7 @@ func resolveKeyName(k reflect.Value) (string, error) {
256
246
panic ("unexpected map key type" )
257
247
}
258
248
259
- var (
260
- _ json.Unmarshaler = (* OrderedMap [string , string ])(nil )
261
- _ json2.UnmarshalerFrom = (* OrderedMap [string , string ])(nil )
262
- )
263
-
264
- func (m * OrderedMap [K , V ]) UnmarshalJSON (data []byte ) error {
265
- if string (data ) == "null" {
266
- // By convention, to approximate the behavior of Unmarshal itself,
267
- // Unmarshalers implement UnmarshalJSON([]byte("null")) as a no-op.
268
- // https://pkg.go.dev/encoding/json#Unmarshaler
269
- return nil
270
- }
271
- dec := json .NewDecoder (bytes .NewReader (data ))
272
- token , err := dec .Token ()
273
- if err != nil {
274
- return err
275
- }
276
- if token != json .Delim ('{' ) {
277
- return errors .New ("cannot unmarshal non-object JSON value into Map" )
278
- }
279
- for dec .More () {
280
- nameToken , err := dec .Token ()
281
- if err != nil {
282
- return err
283
- }
284
- if nameToken == json .Delim ('}' ) {
285
- break
286
- }
287
- if key , ok := nameToken .(K ); ok {
288
- var valueBytes json.RawMessage
289
- if err := dec .Decode (& valueBytes ); err != nil {
290
- return err
291
- }
292
- var value V
293
- if err := json .Unmarshal (valueBytes , & value ); err != nil {
294
- return err
295
- }
296
- m .Set (key , value )
297
- } else {
298
- return fmt .Errorf ("cannot unmarshal key into Map[%v, ...]" , reflect .TypeFor [K ]())
299
- }
300
- }
301
- return nil
302
- }
249
+ var _ json.UnmarshalerFrom = (* OrderedMap [string , string ])(nil )
303
250
304
251
func (m * OrderedMap [K , V ]) UnmarshalJSONFrom (dec * jsontext.Decoder ) error {
305
252
token , err := dec .ReadToken ()
@@ -310,6 +257,7 @@ func (m *OrderedMap[K, V]) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
310
257
// By convention, to approximate the behavior of Unmarshal itself,
311
258
// Unmarshalers implement UnmarshalJSON([]byte("null")) as a no-op.
312
259
// https://pkg.go.dev/encoding/json#Unmarshaler
260
+ // TODO: reconsider
313
261
return nil
314
262
}
315
263
if token .Kind () != '{' { // jsontext.ObjectStart.Kind()
@@ -318,10 +266,10 @@ func (m *OrderedMap[K, V]) UnmarshalJSONFrom(dec *jsontext.Decoder) error {
318
266
for dec .PeekKind () != '}' { // jsontext.ObjectEnd.Kind()
319
267
var key K
320
268
var value V
321
- if err := json2 .UnmarshalDecode (dec , & key ); err != nil {
269
+ if err := json .UnmarshalDecode (dec , & key ); err != nil {
322
270
return err
323
271
}
324
- if err := json2 .UnmarshalDecode (dec , & value ); err != nil {
272
+ if err := json .UnmarshalDecode (dec , & value ); err != nil {
325
273
return err
326
274
}
327
275
m .Set (key , value )
0 commit comments