| // Copyright 2026 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 protojson | |
| import ( | |
| "google.golang.org/protobuf/internal/genid" | |
| "google.golang.org/protobuf/reflect/protoreflect" | |
| "google.golang.org/protobuf/types/jsonenumvalueoptionspb" | |
| ) | |
| // enumValueJSONNameOption reads the (pb.enumvalue.json).string option on desc, | |
| // returning the custom JSON name and true if set. | |
| func enumValueJSONNameOption(desc protoreflect.EnumValueDescriptor) (string, bool) { | |
| opts := desc.Options() | |
| if opts == nil || !opts.ProtoReflect().IsValid() { | |
| return "", false | |
| } | |
| // We must not use proto.GetExtension(opts, jsonenumvalueoptionspb.E_Json) | |
| // because that only works for messages we generated, but not for | |
| // dynamicpb messages. See golang/protobuf#1669. | |
| jsonOpts := opts.ProtoReflect().Get(jsonenumvalueoptionspb.E_Json.TypeDescriptor()) | |
| if !jsonOpts.IsValid() { | |
| return "", false | |
| } | |
| jm, ok := jsonOpts.Interface().(protoreflect.Message) | |
| if !ok { | |
| return "", false | |
| } | |
| fields := jm.Descriptor().Fields() | |
| if fd := fields.ByNumber(genid.JsonEnumValueOptions_String__field_number); fd != nil && | |
| !fd.IsList() && | |
| fd.Kind() == protoreflect.StringKind && | |
| jm.Has(fd) { | |
| return jm.Get(fd).String(), true | |
| } | |
| return "", false | |
| } |