@@ -268,8 +268,11 @@ func (enc Encoder) marshal(value protoreflect.Value, fd protoreflect.FieldDescri
268
268
}
269
269
270
270
type nameAndIndex struct {
271
- i int
272
- name string
271
+ i int
272
+ name string
273
+ oneof protoreflect.OneofDescriptor
274
+ oneofFieldName string
275
+ oneofTypeName string
273
276
}
274
277
275
278
func (enc Encoder ) marshalMessage (msg protoreflect.Message , writer io.Writer ) error {
@@ -300,14 +303,37 @@ func (enc Encoder) marshalMessage(msg protoreflect.Message, writer io.Writer) er
300
303
indices := make ([]* nameAndIndex , 0 , fields .Len ())
301
304
for i := 0 ; i < fields .Len (); i ++ {
302
305
f := fields .Get (i )
303
- name := getAminoFieldName (f )
304
- indices = append (indices , & nameAndIndex {i : i , name : name })
306
+ entry := & nameAndIndex {
307
+ i : i ,
308
+ name : getAminoFieldName (f ),
309
+ oneof : f .ContainingOneof (),
310
+ }
311
+
312
+ if entry .oneof != nil {
313
+ var err error
314
+ entry .oneofFieldName , entry .oneofTypeName , err = getOneOfNames (f )
315
+ if err != nil {
316
+ return err
317
+ }
318
+ }
319
+
320
+ indices = append (indices , entry )
305
321
}
306
322
307
323
if shouldSortFields := ! enc .doNotSortFields ; shouldSortFields {
308
324
sort .Slice (indices , func (i , j int ) bool {
309
325
ni , nj := indices [i ], indices [j ]
310
- return ni .name < nj .name
326
+ niName , njName := ni .name , nj .name
327
+
328
+ if indices [i ].oneof != nil {
329
+ niName = indices [i ].oneofFieldName
330
+ }
331
+
332
+ if indices [j ].oneof != nil {
333
+ njName = indices [j ].oneofFieldName
334
+ }
335
+
336
+ return niName < njName
311
337
})
312
338
}
313
339
@@ -316,22 +342,17 @@ func (enc Encoder) marshalMessage(msg protoreflect.Message, writer io.Writer) er
316
342
name := ni .name
317
343
f := fields .Get (i )
318
344
v := msg .Get (f )
319
- oneof := f .ContainingOneof ()
320
- isOneOf := oneof != nil
321
- oneofFieldName , oneofTypeName , err := getOneOfNames (f )
322
- if err != nil && isOneOf {
323
- return err
324
- }
345
+ isOneOf := ni .oneof != nil
325
346
writeNil := false
326
347
327
348
if ! msg .Has (f ) {
328
349
// msg.WhichOneof(oneof) == nil: no field of the oneof has been set
329
350
// !emptyOneOfWritten: we haven't written a null for this oneof yet (only write one null per empty oneof)
330
351
switch {
331
- case isOneOf && msg .WhichOneof (oneof ) == nil && ! emptyOneOfWritten [oneofFieldName ]:
332
- name = oneofFieldName
352
+ case isOneOf && msg .WhichOneof (ni . oneof ) == nil && ! emptyOneOfWritten [ni . oneofFieldName ]:
353
+ name = ni . oneofFieldName
333
354
writeNil = true
334
- emptyOneOfWritten [oneofFieldName ] = true
355
+ emptyOneOfWritten [ni . oneofFieldName ] = true
335
356
case omitEmpty (f ):
336
357
continue
337
358
case f .Kind () == protoreflect .MessageKind &&
@@ -349,7 +370,7 @@ func (enc Encoder) marshalMessage(msg protoreflect.Message, writer io.Writer) er
349
370
}
350
371
351
372
if isOneOf && ! writeNil {
352
- _ , err = fmt .Fprintf (writer , `"%s":{"type":"%s","value":{` , oneofFieldName , oneofTypeName )
373
+ _ , err = fmt .Fprintf (writer , `"%s":{"type":"%s","value":{` , ni . oneofFieldName , ni . oneofTypeName )
353
374
if err != nil {
354
375
return err
355
376
}
0 commit comments