| // Copyright 2019 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Package fieldsort defines an ordering of fields. |
| // |
| // The ordering defined by this package matches the historic behavior of the proto |
| // package, placing extensions first and oneofs last. |
| // |
| // There is no guarantee about stability of the wire encoding, and users should not |
| // depend on the order defined in this package as it is subject to change without |
| // notice. |
| package fieldsort |
| |
| import ( |
| "google.golang.org/protobuf/reflect/protoreflect" |
| ) |
| |
| // Less returns true if field a comes before field j in ordered wire marshal output. |
| func Less(a, b protoreflect.FieldDescriptor) bool { |
| ea := a.IsExtension() |
| eb := b.IsExtension() |
| oa := a.ContainingOneof() |
| ob := b.ContainingOneof() |
| switch { |
| case ea != eb: |
| return ea |
| case oa != nil && ob != nil: |
| if oa == ob { |
| return a.Number() < b.Number() |
| } |
| return oa.Index() < ob.Index() |
| case oa != nil: |
| return false |
| case ob != nil: |
| return true |
| default: |
| return a.Number() < b.Number() |
| } |
| } |