encoding/jsonpb: remove encoder and decoder types

I had defined these types at some point in order to reuse another
instance of these within, but it's not needed anymore and hence removing
them.

Change-Id: I8aa127326a5926c6a8688d83cce7ca83c160b39b
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/169700
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/encoding/jsonpb/decode.go b/encoding/jsonpb/decode.go
index 8436c38..221adc7 100644
--- a/encoding/jsonpb/decode.go
+++ b/encoding/jsonpb/decode.go
@@ -33,6 +33,8 @@
 	// and processing Any. If Resolver is not set, unmarshaling will default to
 	// using protoregistry.GlobalTypes.
 	Resolver *protoregistry.Types
+
+	decoder *json.Decoder
 }
 
 // Unmarshal reads the given []byte and populates the given proto.Message using
@@ -46,22 +48,18 @@
 	// marshaling.
 	resetMessage(mr)
 
-	resolver := o.Resolver
-	if resolver == nil {
-		resolver = protoregistry.GlobalTypes
+	if o.Resolver == nil {
+		o.Resolver = protoregistry.GlobalTypes
 	}
+	o.decoder = json.NewDecoder(b)
 
-	dec := decoder{
-		Decoder:  json.NewDecoder(b),
-		resolver: resolver,
-	}
 	var nerr errors.NonFatal
-	if err := dec.unmarshalMessage(mr); !nerr.Merge(err) {
+	if err := o.unmarshalMessage(mr); !nerr.Merge(err) {
 		return err
 	}
 
 	// Check for EOF.
-	val, err := dec.Read()
+	val, err := o.decoder.Read()
 	if err != nil {
 		return err
 	}
@@ -91,8 +89,8 @@
 }
 
 // unexpectedJSONError is an error that contains the unexpected json.Value. This
-// is used by decoder methods to provide callers the read json.Value that it
-// did not expect.
+// is returned by methods to provide callers the read json.Value that it did not
+// expect.
 // TODO: Consider moving this to internal/encoding/json for consistency with
 // errors that package returns.
 type unexpectedJSONError struct {
@@ -122,21 +120,15 @@
 	return e
 }
 
-// decoder decodes JSON into protoreflect values.
-type decoder struct {
-	*json.Decoder
-	resolver *protoregistry.Types
-}
-
 // unmarshalMessage unmarshals a message into the given protoreflect.Message.
-func (d decoder) unmarshalMessage(m pref.Message) error {
+func (o UnmarshalOptions) unmarshalMessage(m pref.Message) error {
 	var nerr errors.NonFatal
 
 	if isCustomType(m.Type().FullName()) {
-		return d.unmarshalCustomType(m)
+		return o.unmarshalCustomType(m)
 	}
 
-	jval, err := d.Read()
+	jval, err := o.decoder.Read()
 	if !nerr.Merge(err) {
 		return err
 	}
@@ -144,7 +136,7 @@
 		return unexpectedJSONError{jval}
 	}
 
-	if err := d.unmarshalFields(m); !nerr.Merge(err) {
+	if err := o.unmarshalFields(m); !nerr.Merge(err) {
 		return err
 	}
 
@@ -152,7 +144,7 @@
 }
 
 // unmarshalFields unmarshals the fields into the given protoreflect.Message.
-func (d decoder) unmarshalFields(m pref.Message) error {
+func (o UnmarshalOptions) unmarshalFields(m pref.Message) error {
 	var nerr errors.NonFatal
 	var reqNums set.Ints
 	var seenNums set.Ints
@@ -165,7 +157,7 @@
 Loop:
 	for {
 		// Read field name.
-		jval, err := d.Read()
+		jval, err := o.decoder.Read()
 		if !nerr.Merge(err) {
 			return err
 		}
@@ -190,7 +182,7 @@
 			xtName := pref.FullName(name[1 : len(name)-1])
 			xt := xtTypes.ByName(xtName)
 			if xt == nil {
-				xt, err = d.findExtension(xtName)
+				xt, err = o.findExtension(xtName)
 				if err != nil && err != protoregistry.NotFound {
 					return errors.New("unable to resolve [%v]: %v", xtName, err)
 				}
@@ -222,19 +214,19 @@
 
 		// No need to set values for JSON null unless the field type is
 		// google.protobuf.Value.
-		if d.Peek() == json.Null && !isKnownValue(fd) {
-			d.Read()
+		if o.decoder.Peek() == json.Null && !isKnownValue(fd) {
+			o.decoder.Read()
 			continue
 		}
 
 		if cardinality := fd.Cardinality(); cardinality == pref.Repeated {
 			// Map or list fields have cardinality of repeated.
-			if err := d.unmarshalRepeated(knownFields, fd); !nerr.Merge(err) {
+			if err := o.unmarshalRepeated(knownFields, fd); !nerr.Merge(err) {
 				return errors.New("%v|%q: %v", fd.FullName(), name, err)
 			}
 		} else {
 			// Required or optional fields.
-			if err := d.unmarshalSingular(knownFields, fd); !nerr.Merge(err) {
+			if err := o.unmarshalSingular(knownFields, fd); !nerr.Merge(err) {
 				return errors.New("%v|%q: %v", fd.FullName(), name, err)
 			}
 			if cardinality == pref.Required {
@@ -257,14 +249,14 @@
 }
 
 // findExtension returns protoreflect.ExtensionType from the resolver if found.
-func (d decoder) findExtension(xtName pref.FullName) (pref.ExtensionType, error) {
-	xt, err := d.resolver.FindExtensionByName(xtName)
+func (o UnmarshalOptions) findExtension(xtName pref.FullName) (pref.ExtensionType, error) {
+	xt, err := o.Resolver.FindExtensionByName(xtName)
 	if err == nil {
 		return xt, nil
 	}
 
 	// Check if this is a MessageSet extension field.
-	xt, err = d.resolver.FindExtensionByName(xtName + ".message_set_extension")
+	xt, err = o.Resolver.FindExtensionByName(xtName + ".message_set_extension")
 	if err == nil && isMessageSetExtension(xt) {
 		return xt, nil
 	}
@@ -273,7 +265,7 @@
 
 // unmarshalSingular unmarshals to the non-repeated field specified by the given
 // FieldDescriptor.
-func (d decoder) unmarshalSingular(knownFields pref.KnownFields, fd pref.FieldDescriptor) error {
+func (o UnmarshalOptions) unmarshalSingular(knownFields pref.KnownFields, fd pref.FieldDescriptor) error {
 	var val pref.Value
 	var err error
 	num := fd.Number()
@@ -281,10 +273,10 @@
 	switch fd.Kind() {
 	case pref.MessageKind, pref.GroupKind:
 		m := knownFields.NewMessage(num)
-		err = d.unmarshalMessage(m)
+		err = o.unmarshalMessage(m)
 		val = pref.ValueOf(m)
 	default:
-		val, err = d.unmarshalScalar(fd)
+		val, err = o.unmarshalScalar(fd)
 	}
 
 	var nerr errors.NonFatal
@@ -297,12 +289,12 @@
 
 // unmarshalScalar unmarshals to a scalar/enum protoreflect.Value specified by
 // the given FieldDescriptor.
-func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) {
+func (o UnmarshalOptions) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) {
 	const b32 int = 32
 	const b64 int = 64
 
 	var nerr errors.NonFatal
-	jval, err := d.Read()
+	jval, err := o.decoder.Read()
 	if !nerr.Merge(err) {
 		return pref.Value{}, err
 	}
@@ -509,16 +501,16 @@
 }
 
 // unmarshalRepeated unmarshals into a repeated field.
-func (d decoder) unmarshalRepeated(knownFields pref.KnownFields, fd pref.FieldDescriptor) error {
+func (o UnmarshalOptions) unmarshalRepeated(knownFields pref.KnownFields, fd pref.FieldDescriptor) error {
 	var nerr errors.NonFatal
 	num := fd.Number()
 	val := knownFields.Get(num)
 	if !fd.IsMap() {
-		if err := d.unmarshalList(val.List(), fd); !nerr.Merge(err) {
+		if err := o.unmarshalList(val.List(), fd); !nerr.Merge(err) {
 			return err
 		}
 	} else {
-		if err := d.unmarshalMap(val.Map(), fd); !nerr.Merge(err) {
+		if err := o.unmarshalMap(val.Map(), fd); !nerr.Merge(err) {
 			return err
 		}
 	}
@@ -526,9 +518,9 @@
 }
 
 // unmarshalList unmarshals into given protoreflect.List.
-func (d decoder) unmarshalList(list pref.List, fd pref.FieldDescriptor) error {
+func (o UnmarshalOptions) unmarshalList(list pref.List, fd pref.FieldDescriptor) error {
 	var nerr errors.NonFatal
-	jval, err := d.Read()
+	jval, err := o.decoder.Read()
 	if !nerr.Merge(err) {
 		return err
 	}
@@ -540,7 +532,7 @@
 	case pref.MessageKind, pref.GroupKind:
 		for {
 			m := list.NewMessage()
-			err := d.unmarshalMessage(m)
+			err := o.unmarshalMessage(m)
 			if !nerr.Merge(err) {
 				if e, ok := err.(unexpectedJSONError); ok {
 					if e.value.Type() == json.EndArray {
@@ -554,7 +546,7 @@
 		}
 	default:
 		for {
-			val, err := d.unmarshalScalar(fd)
+			val, err := o.unmarshalScalar(fd)
 			if !nerr.Merge(err) {
 				if e, ok := err.(unexpectedJSONError); ok {
 					if e.value.Type() == json.EndArray {
@@ -571,10 +563,10 @@
 }
 
 // unmarshalMap unmarshals into given protoreflect.Map.
-func (d decoder) unmarshalMap(mmap pref.Map, fd pref.FieldDescriptor) error {
+func (o UnmarshalOptions) unmarshalMap(mmap pref.Map, fd pref.FieldDescriptor) error {
 	var nerr errors.NonFatal
 
-	jval, err := d.Read()
+	jval, err := o.decoder.Read()
 	if !nerr.Merge(err) {
 		return err
 	}
@@ -590,14 +582,14 @@
 	// order to call the appropriate unmarshalMapValue func inside the for loop
 	// below.
 	unmarshalMapValue := func() (pref.Value, error) {
-		return d.unmarshalScalar(valDesc)
+		return o.unmarshalScalar(valDesc)
 	}
 	switch valDesc.Kind() {
 	case pref.MessageKind, pref.GroupKind:
 		unmarshalMapValue = func() (pref.Value, error) {
 			var nerr errors.NonFatal
 			m := mmap.NewMessage()
-			if err := d.unmarshalMessage(m); !nerr.Merge(err) {
+			if err := o.unmarshalMessage(m); !nerr.Merge(err) {
 				return pref.Value{}, err
 			}
 			return pref.ValueOf(m), nerr.E
@@ -607,7 +599,7 @@
 Loop:
 	for {
 		// Read field name.
-		jval, err := d.Read()
+		jval, err := o.decoder.Read()
 		if !nerr.Merge(err) {
 			return err
 		}
diff --git a/encoding/jsonpb/encode.go b/encoding/jsonpb/encode.go
index 9bfadda..b3a0a76 100644
--- a/encoding/jsonpb/encode.go
+++ b/encoding/jsonpb/encode.go
@@ -37,55 +37,41 @@
 	// google.protobuf.Any messages. If Resolver is not set, marshaling will
 	// default to using protoregistry.GlobalTypes.
 	Resolver *protoregistry.Types
+
+	encoder *json.Encoder
 }
 
 // Marshal marshals the given proto.Message in the JSON format using options in
 // MarshalOptions.
 func (o MarshalOptions) Marshal(m proto.Message) ([]byte, error) {
-	enc, err := newEncoder(o.Indent, o.Resolver)
+	var err error
+	o.encoder, err = json.NewEncoder(o.Indent)
 	if err != nil {
 		return nil, err
 	}
+	if o.Resolver == nil {
+		o.Resolver = protoregistry.GlobalTypes
+	}
 
 	var nerr errors.NonFatal
-	err = enc.marshalMessage(m.ProtoReflect())
+	err = o.marshalMessage(m.ProtoReflect())
 	if !nerr.Merge(err) {
 		return nil, err
 	}
-	return enc.Bytes(), nerr.E
-}
-
-// encoder encodes protoreflect values into JSON.
-type encoder struct {
-	*json.Encoder
-	resolver *protoregistry.Types
-}
-
-func newEncoder(indent string, resolver *protoregistry.Types) (encoder, error) {
-	enc, err := json.NewEncoder(indent)
-	if err != nil {
-		return encoder{}, err
-	}
-	if resolver == nil {
-		resolver = protoregistry.GlobalTypes
-	}
-	return encoder{
-		Encoder:  enc,
-		resolver: resolver,
-	}, nil
+	return o.encoder.Bytes(), nerr.E
 }
 
 // marshalMessage marshals the given protoreflect.Message.
-func (e encoder) marshalMessage(m pref.Message) error {
+func (o MarshalOptions) marshalMessage(m pref.Message) error {
 	var nerr errors.NonFatal
 
 	if isCustomType(m.Type().FullName()) {
-		return e.marshalCustomType(m)
+		return o.marshalCustomType(m)
 	}
 
-	e.StartObject()
-	defer e.EndObject()
-	if err := e.marshalFields(m); !nerr.Merge(err) {
+	o.encoder.StartObject()
+	defer o.encoder.EndObject()
+	if err := o.marshalFields(m); !nerr.Merge(err) {
 		return err
 	}
 
@@ -93,7 +79,7 @@
 }
 
 // marshalFields marshals the fields in the given protoreflect.Message.
-func (e encoder) marshalFields(m pref.Message) error {
+func (o MarshalOptions) marshalFields(m pref.Message) error {
 	var nerr errors.NonFatal
 	fieldDescs := m.Type().Fields()
 	knownFields := m.KnownFields()
@@ -113,38 +99,38 @@
 
 		name := fd.JSONName()
 		val := knownFields.Get(num)
-		if err := e.WriteName(name); !nerr.Merge(err) {
+		if err := o.encoder.WriteName(name); !nerr.Merge(err) {
 			return err
 		}
-		if err := e.marshalValue(val, fd); !nerr.Merge(err) {
+		if err := o.marshalValue(val, fd); !nerr.Merge(err) {
 			return err
 		}
 	}
 
 	// Marshal out extensions.
-	if err := e.marshalExtensions(knownFields); !nerr.Merge(err) {
+	if err := o.marshalExtensions(knownFields); !nerr.Merge(err) {
 		return err
 	}
 	return nerr.E
 }
 
 // marshalValue marshals the given protoreflect.Value.
-func (e encoder) marshalValue(val pref.Value, fd pref.FieldDescriptor) error {
+func (o MarshalOptions) marshalValue(val pref.Value, fd pref.FieldDescriptor) error {
 	var nerr errors.NonFatal
 	if fd.Cardinality() == pref.Repeated {
 		// Map or repeated fields.
 		if fd.IsMap() {
-			if err := e.marshalMap(val.Map(), fd); !nerr.Merge(err) {
+			if err := o.marshalMap(val.Map(), fd); !nerr.Merge(err) {
 				return err
 			}
 		} else {
-			if err := e.marshalList(val.List(), fd); !nerr.Merge(err) {
+			if err := o.marshalList(val.List(), fd); !nerr.Merge(err) {
 				return err
 			}
 		}
 	} else {
 		// Required or optional fields.
-		if err := e.marshalSingular(val, fd); !nerr.Merge(err) {
+		if err := o.marshalSingular(val, fd); !nerr.Merge(err) {
 			return err
 		}
 	}
@@ -153,38 +139,38 @@
 
 // marshalSingular marshals the given non-repeated field value. This includes
 // all scalar types, enums, messages, and groups.
-func (e encoder) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error {
+func (o MarshalOptions) marshalSingular(val pref.Value, fd pref.FieldDescriptor) error {
 	var nerr errors.NonFatal
 	switch kind := fd.Kind(); kind {
 	case pref.BoolKind:
-		e.WriteBool(val.Bool())
+		o.encoder.WriteBool(val.Bool())
 
 	case pref.StringKind:
-		if err := e.WriteString(val.String()); !nerr.Merge(err) {
+		if err := o.encoder.WriteString(val.String()); !nerr.Merge(err) {
 			return err
 		}
 
 	case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
-		e.WriteInt(val.Int())
+		o.encoder.WriteInt(val.Int())
 
 	case pref.Uint32Kind, pref.Fixed32Kind:
-		e.WriteUint(val.Uint())
+		o.encoder.WriteUint(val.Uint())
 
 	case pref.Int64Kind, pref.Sint64Kind, pref.Uint64Kind,
 		pref.Sfixed64Kind, pref.Fixed64Kind:
 		// 64-bit integers are written out as JSON string.
-		e.WriteString(val.String())
+		o.encoder.WriteString(val.String())
 
 	case pref.FloatKind:
 		// Encoder.WriteFloat handles the special numbers NaN and infinites.
-		e.WriteFloat(val.Float(), 32)
+		o.encoder.WriteFloat(val.Float(), 32)
 
 	case pref.DoubleKind:
 		// Encoder.WriteFloat handles the special numbers NaN and infinites.
-		e.WriteFloat(val.Float(), 64)
+		o.encoder.WriteFloat(val.Float(), 64)
 
 	case pref.BytesKind:
-		err := e.WriteString(base64.StdEncoding.EncodeToString(val.Bytes()))
+		err := o.encoder.WriteString(base64.StdEncoding.EncodeToString(val.Bytes()))
 		if !nerr.Merge(err) {
 			return err
 		}
@@ -194,19 +180,19 @@
 		num := val.Enum()
 
 		if enumType.FullName() == "google.protobuf.NullValue" {
-			e.WriteNull()
+			o.encoder.WriteNull()
 		} else if desc := enumType.Values().ByNumber(num); desc != nil {
-			err := e.WriteString(string(desc.Name()))
+			err := o.encoder.WriteString(string(desc.Name()))
 			if !nerr.Merge(err) {
 				return err
 			}
 		} else {
 			// Use numeric value if there is no enum value descriptor.
-			e.WriteInt(int64(num))
+			o.encoder.WriteInt(int64(num))
 		}
 
 	case pref.MessageKind, pref.GroupKind:
-		if err := e.marshalMessage(val.Message()); !nerr.Merge(err) {
+		if err := o.marshalMessage(val.Message()); !nerr.Merge(err) {
 			return err
 		}
 
@@ -217,14 +203,14 @@
 }
 
 // marshalList marshals the given protoreflect.List.
-func (e encoder) marshalList(list pref.List, fd pref.FieldDescriptor) error {
-	e.StartArray()
-	defer e.EndArray()
+func (o MarshalOptions) marshalList(list pref.List, fd pref.FieldDescriptor) error {
+	o.encoder.StartArray()
+	defer o.encoder.EndArray()
 
 	var nerr errors.NonFatal
 	for i := 0; i < list.Len(); i++ {
 		item := list.Get(i)
-		if err := e.marshalSingular(item, fd); !nerr.Merge(err) {
+		if err := o.marshalSingular(item, fd); !nerr.Merge(err) {
 			return err
 		}
 	}
@@ -237,9 +223,9 @@
 }
 
 // marshalMap marshals given protoreflect.Map.
-func (e encoder) marshalMap(mmap pref.Map, fd pref.FieldDescriptor) error {
-	e.StartObject()
-	defer e.EndObject()
+func (o MarshalOptions) marshalMap(mmap pref.Map, fd pref.FieldDescriptor) error {
+	o.encoder.StartObject()
+	defer o.encoder.EndObject()
 
 	msgFields := fd.MessageType().Fields()
 	keyType := msgFields.ByNumber(1)
@@ -256,10 +242,10 @@
 	// Write out sorted list.
 	var nerr errors.NonFatal
 	for _, entry := range entries {
-		if err := e.WriteName(entry.key.String()); !nerr.Merge(err) {
+		if err := o.encoder.WriteName(entry.key.String()); !nerr.Merge(err) {
 			return err
 		}
-		if err := e.marshalSingular(entry.value, valType); !nerr.Merge(err) {
+		if err := o.marshalSingular(entry.value, valType); !nerr.Merge(err) {
 			return err
 		}
 	}
@@ -283,7 +269,7 @@
 }
 
 // marshalExtensions marshals extension fields.
-func (e encoder) marshalExtensions(knownFields pref.KnownFields) error {
+func (o MarshalOptions) marshalExtensions(knownFields pref.KnownFields) error {
 	type xtEntry struct {
 		key    string
 		value  pref.Value
@@ -325,10 +311,10 @@
 		// JSON field name is the proto field name enclosed in [], similar to
 		// textproto. This is consistent with Go v1 lib. C++ lib v3.7.0 does not
 		// marshal out extension fields.
-		if err := e.WriteName("[" + entry.key + "]"); !nerr.Merge(err) {
+		if err := o.encoder.WriteName("[" + entry.key + "]"); !nerr.Merge(err) {
 			return err
 		}
-		if err := e.marshalValue(entry.value, entry.xtType); !nerr.Merge(err) {
+		if err := o.marshalValue(entry.value, entry.xtType); !nerr.Merge(err) {
 			return err
 		}
 	}
diff --git a/encoding/jsonpb/well_known_types.go b/encoding/jsonpb/well_known_types.go
index 822520e..941e3be 100644
--- a/encoding/jsonpb/well_known_types.go
+++ b/encoding/jsonpb/well_known_types.go
@@ -48,11 +48,11 @@
 // marshalCustomType marshals given well-known type message that have special
 // JSON conversion rules. It needs to be a message type where isCustomType
 // returns true, else it will panic.
-func (e encoder) marshalCustomType(m pref.Message) error {
+func (o MarshalOptions) marshalCustomType(m pref.Message) error {
 	name := m.Type().FullName()
 	switch name {
 	case "google.protobuf.Any":
-		return e.marshalAny(m)
+		return o.marshalAny(m)
 
 	case "google.protobuf.BoolValue",
 		"google.protobuf.DoubleValue",
@@ -63,25 +63,25 @@
 		"google.protobuf.UInt64Value",
 		"google.protobuf.StringValue",
 		"google.protobuf.BytesValue":
-		return e.marshalWrapperType(m)
+		return o.marshalWrapperType(m)
 
 	case "google.protobuf.Struct":
-		return e.marshalStruct(m)
+		return o.marshalStruct(m)
 
 	case "google.protobuf.ListValue":
-		return e.marshalListValue(m)
+		return o.marshalListValue(m)
 
 	case "google.protobuf.Value":
-		return e.marshalKnownValue(m)
+		return o.marshalKnownValue(m)
 
 	case "google.protobuf.Duration":
-		return e.marshalDuration(m)
+		return o.marshalDuration(m)
 
 	case "google.protobuf.Timestamp":
-		return e.marshalTimestamp(m)
+		return o.marshalTimestamp(m)
 
 	case "google.protobuf.FieldMask":
-		return e.marshalFieldMask(m)
+		return o.marshalFieldMask(m)
 	}
 
 	panic(fmt.Sprintf("%q does not have a custom marshaler", name))
@@ -90,7 +90,7 @@
 // unmarshalCustomType unmarshals given well-known type message that have
 // special JSON conversion rules. It needs to be a message type where
 // isCustomType returns true, else it will panic.
-func (d decoder) unmarshalCustomType(m pref.Message) error {
+func (o UnmarshalOptions) unmarshalCustomType(m pref.Message) error {
 	name := m.Type().FullName()
 	switch name {
 	case "google.protobuf.Any":
@@ -105,25 +105,25 @@
 		"google.protobuf.UInt64Value",
 		"google.protobuf.StringValue",
 		"google.protobuf.BytesValue":
-		return d.unmarshalWrapperType(m)
+		return o.unmarshalWrapperType(m)
 
 	case "google.protobuf.Struct":
-		return d.unmarshalStruct(m)
+		return o.unmarshalStruct(m)
 
 	case "google.protobuf.ListValue":
-		return d.unmarshalListValue(m)
+		return o.unmarshalListValue(m)
 
 	case "google.protobuf.Value":
-		return d.unmarshalKnownValue(m)
+		return o.unmarshalKnownValue(m)
 
 	case "google.protobuf.Duration":
-		return d.unmarshalDuration(m)
+		return o.unmarshalDuration(m)
 
 	case "google.protobuf.Timestamp":
-		return d.unmarshalTimestamp(m)
+		return o.unmarshalTimestamp(m)
 
 	case "google.protobuf.FieldMask":
-		return d.unmarshalFieldMask(m)
+		return o.unmarshalFieldMask(m)
 	}
 
 	panic(fmt.Sprintf("%q does not have a custom unmarshaler", name))
@@ -135,14 +135,14 @@
 // custom JSON representation, that representation will be embedded adding a
 // field `value` which holds the custom JSON in addition to the `@type` field.
 
-func (e encoder) marshalAny(m pref.Message) error {
+func (o MarshalOptions) marshalAny(m pref.Message) error {
 	var nerr errors.NonFatal
 	msgType := m.Type()
 	knownFields := m.KnownFields()
 
 	// Start writing the JSON object.
-	e.StartObject()
-	defer e.EndObject()
+	o.encoder.StartObject()
+	defer o.encoder.EndObject()
 
 	if !knownFields.Has(fieldnum.Any_TypeUrl) {
 		if !knownFields.Has(fieldnum.Any_Value) {
@@ -159,13 +159,13 @@
 
 	// Marshal out @type field.
 	typeURL := typeVal.String()
-	e.WriteName("@type")
-	if err := e.WriteString(typeURL); !nerr.Merge(err) {
+	o.encoder.WriteName("@type")
+	if err := o.encoder.WriteString(typeURL); !nerr.Merge(err) {
 		return err
 	}
 
 	// Resolve the type in order to unmarshal value field.
-	emt, err := e.resolver.FindMessageByURL(typeURL)
+	emt, err := o.Resolver.FindMessageByURL(typeURL)
 	if !nerr.Merge(err) {
 		return errors.New("%s: unable to resolve %q: %v", msgType.FullName(), typeURL, err)
 	}
@@ -181,12 +181,12 @@
 	// with corresponding custom JSON encoding of the embedded message as a
 	// field.
 	if isCustomType(emt.FullName()) {
-		e.WriteName("value")
-		return e.marshalCustomType(em)
+		o.encoder.WriteName("value")
+		return o.marshalCustomType(em)
 	}
 
 	// Else, marshal out the embedded message's fields in this Any object.
-	if err := e.marshalFields(em); !nerr.Merge(err) {
+	if err := o.marshalFields(em); !nerr.Merge(err) {
 		return err
 	}
 
@@ -195,7 +195,7 @@
 
 // Wrapper types are encoded as JSON primitives like string, number or boolean.
 
-func (e encoder) marshalWrapperType(m pref.Message) error {
+func (o MarshalOptions) marshalWrapperType(m pref.Message) error {
 	msgType := m.Type()
 	fieldDescs := msgType.Fields()
 	knownFields := m.KnownFields()
@@ -204,10 +204,10 @@
 	const num = fieldnum.BoolValue_Value
 	fd := fieldDescs.ByNumber(num)
 	val := knownFields.Get(num)
-	return e.marshalSingular(val, fd)
+	return o.marshalSingular(val, fd)
 }
 
-func (d decoder) unmarshalWrapperType(m pref.Message) error {
+func (o UnmarshalOptions) unmarshalWrapperType(m pref.Message) error {
 	var nerr errors.NonFatal
 	msgType := m.Type()
 	fieldDescs := msgType.Fields()
@@ -216,7 +216,7 @@
 	// The "value" field has the same field number for all wrapper types.
 	const num = fieldnum.BoolValue_Value
 	fd := fieldDescs.ByNumber(num)
-	val, err := d.unmarshalScalar(fd)
+	val, err := o.unmarshalScalar(fd)
 	if !nerr.Merge(err) {
 		return err
 	}
@@ -227,55 +227,55 @@
 // The JSON representation for Struct is a JSON object that contains the encoded
 // Struct.fields map and follows the serialization rules for a map.
 
-func (e encoder) marshalStruct(m pref.Message) error {
+func (o MarshalOptions) marshalStruct(m pref.Message) error {
 	msgType := m.Type()
 	fieldDescs := msgType.Fields()
 	knownFields := m.KnownFields()
 
 	fd := fieldDescs.ByNumber(fieldnum.Struct_Fields)
 	val := knownFields.Get(fieldnum.Struct_Fields)
-	return e.marshalMap(val.Map(), fd)
+	return o.marshalMap(val.Map(), fd)
 }
 
-func (d decoder) unmarshalStruct(m pref.Message) error {
+func (o UnmarshalOptions) unmarshalStruct(m pref.Message) error {
 	msgType := m.Type()
 	fieldDescs := msgType.Fields()
 	knownFields := m.KnownFields()
 
 	fd := fieldDescs.ByNumber(fieldnum.Struct_Fields)
 	val := knownFields.Get(fieldnum.Struct_Fields)
-	return d.unmarshalMap(val.Map(), fd)
+	return o.unmarshalMap(val.Map(), fd)
 }
 
 // The JSON representation for ListValue is JSON array that contains the encoded
 // ListValue.values repeated field and follows the serialization rules for a
 // repeated field.
 
-func (e encoder) marshalListValue(m pref.Message) error {
+func (o MarshalOptions) marshalListValue(m pref.Message) error {
 	msgType := m.Type()
 	fieldDescs := msgType.Fields()
 	knownFields := m.KnownFields()
 
 	fd := fieldDescs.ByNumber(fieldnum.ListValue_Values)
 	val := knownFields.Get(fieldnum.ListValue_Values)
-	return e.marshalList(val.List(), fd)
+	return o.marshalList(val.List(), fd)
 }
 
-func (d decoder) unmarshalListValue(m pref.Message) error {
+func (o UnmarshalOptions) unmarshalListValue(m pref.Message) error {
 	msgType := m.Type()
 	fieldDescs := msgType.Fields()
 	knownFields := m.KnownFields()
 
 	fd := fieldDescs.ByNumber(fieldnum.ListValue_Values)
 	val := knownFields.Get(fieldnum.ListValue_Values)
-	return d.unmarshalList(val.List(), fd)
+	return o.unmarshalList(val.List(), fd)
 }
 
 // The JSON representation for a Value is dependent on the oneof field that is
 // set. Each of the field in the oneof has its own custom serialization rule. A
 // Value message needs to be a oneof field set, else it is an error.
 
-func (e encoder) marshalKnownValue(m pref.Message) error {
+func (o MarshalOptions) marshalKnownValue(m pref.Message) error {
 	msgType := m.Type()
 	fieldDescs := msgType.Oneofs().Get(0).Fields()
 	knownFields := m.KnownFields()
@@ -288,7 +288,7 @@
 		}
 		// Only one field should be set.
 		val := knownFields.Get(num)
-		return e.marshalSingular(val, fd)
+		return o.marshalSingular(val, fd)
 	}
 
 	// Return error if none of the fields are set.
@@ -300,17 +300,17 @@
 	return md != nil && md.FullName() == "google.protobuf.Value"
 }
 
-func (d decoder) unmarshalKnownValue(m pref.Message) error {
+func (o UnmarshalOptions) unmarshalKnownValue(m pref.Message) error {
 	var nerr errors.NonFatal
 	knownFields := m.KnownFields()
 
-	switch d.Peek() {
+	switch o.decoder.Peek() {
 	case json.Null:
-		d.Read()
+		o.decoder.Read()
 		knownFields.Set(fieldnum.Value_NullValue, pref.ValueOf(pref.EnumNumber(0)))
 
 	case json.Bool:
-		jval, err := d.Read()
+		jval, err := o.decoder.Read()
 		if err != nil {
 			return err
 		}
@@ -321,7 +321,7 @@
 		knownFields.Set(fieldnum.Value_BoolValue, val)
 
 	case json.Number:
-		jval, err := d.Read()
+		jval, err := o.decoder.Read()
 		if err != nil {
 			return err
 		}
@@ -338,7 +338,7 @@
 		// however, there is no way to identify that and hence a JSON string is
 		// always assigned to the string_value field, which means that certain
 		// encoding cannot be parsed back to the same field.
-		jval, err := d.Read()
+		jval, err := o.decoder.Read()
 		if !nerr.Merge(err) {
 			return err
 		}
@@ -350,20 +350,20 @@
 
 	case json.StartObject:
 		m := knownFields.NewMessage(fieldnum.Value_StructValue)
-		if err := d.unmarshalStruct(m); !nerr.Merge(err) {
+		if err := o.unmarshalStruct(m); !nerr.Merge(err) {
 			return err
 		}
 		knownFields.Set(fieldnum.Value_StructValue, pref.ValueOf(m))
 
 	case json.StartArray:
 		m := knownFields.NewMessage(fieldnum.Value_ListValue)
-		if err := d.unmarshalListValue(m); !nerr.Merge(err) {
+		if err := o.unmarshalListValue(m); !nerr.Merge(err) {
 			return err
 		}
 		knownFields.Set(fieldnum.Value_ListValue, pref.ValueOf(m))
 
 	default:
-		jval, err := d.Read()
+		jval, err := o.decoder.Read()
 		if err != nil {
 			return err
 		}
@@ -390,7 +390,7 @@
 	maxSecondsInDuration = 315576000000
 )
 
-func (e encoder) marshalDuration(m pref.Message) error {
+func (o MarshalOptions) marshalDuration(m pref.Message) error {
 	msgType := m.Type()
 	knownFields := m.KnownFields()
 
@@ -420,13 +420,13 @@
 	x = strings.TrimSuffix(x, "000")
 	x = strings.TrimSuffix(x, "000")
 	x = strings.TrimSuffix(x, ".000")
-	e.WriteString(x + "s")
+	o.encoder.WriteString(x + "s")
 	return nil
 }
 
-func (d decoder) unmarshalDuration(m pref.Message) error {
+func (o UnmarshalOptions) unmarshalDuration(m pref.Message) error {
 	var nerr errors.NonFatal
-	jval, err := d.Read()
+	jval, err := o.decoder.Read()
 	if !nerr.Merge(err) {
 		return err
 	}
@@ -527,7 +527,7 @@
 	minTimestampSeconds = -62135596800
 )
 
-func (e encoder) marshalTimestamp(m pref.Message) error {
+func (o MarshalOptions) marshalTimestamp(m pref.Message) error {
 	msgType := m.Type()
 	knownFields := m.KnownFields()
 
@@ -548,13 +548,13 @@
 	x = strings.TrimSuffix(x, "000")
 	x = strings.TrimSuffix(x, "000")
 	x = strings.TrimSuffix(x, ".000")
-	e.WriteString(x + "Z")
+	o.encoder.WriteString(x + "Z")
 	return nil
 }
 
-func (d decoder) unmarshalTimestamp(m pref.Message) error {
+func (o UnmarshalOptions) unmarshalTimestamp(m pref.Message) error {
 	var nerr errors.NonFatal
-	jval, err := d.Read()
+	jval, err := o.decoder.Read()
 	if !nerr.Merge(err) {
 		return err
 	}
@@ -586,7 +586,7 @@
 // lower-camel naming conventions. Encoding should fail if the path name would
 // end up differently after a round-trip.
 
-func (e encoder) marshalFieldMask(m pref.Message) error {
+func (o MarshalOptions) marshalFieldMask(m pref.Message) error {
 	msgType := m.Type()
 	knownFields := m.KnownFields()
 	name := msgType.FullName()
@@ -605,13 +605,13 @@
 		paths = append(paths, cc)
 	}
 
-	e.WriteString(strings.Join(paths, ","))
+	o.encoder.WriteString(strings.Join(paths, ","))
 	return nil
 }
 
-func (d decoder) unmarshalFieldMask(m pref.Message) error {
+func (o UnmarshalOptions) unmarshalFieldMask(m pref.Message) error {
 	var nerr errors.NonFatal
-	jval, err := d.Read()
+	jval, err := o.decoder.Read()
 	if !nerr.Merge(err) {
 		return err
 	}