summaryrefslogtreecommitdiff
path: root/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/go.mongodb.org/mongo-driver/bson/bsoncodec')
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/array_codec.go55
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/bsoncodec.go382
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/byte_slice_codec.go138
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/codec_cache.go166
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/cond_addr_codec.go63
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go1807
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go856
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go95
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/empty_interface_codec.go173
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/map_codec.go343
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/mode.go65
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/pointer_codec.go108
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/proxy.go14
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go524
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/slice_codec.go214
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/string_codec.go140
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go736
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_tag_parser.go148
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/time_codec.go151
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go58
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/uint_codec.go198
21 files changed, 0 insertions, 6434 deletions
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/array_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/array_codec.go
deleted file mode 100644
index 652aa48b8..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/array_codec.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "reflect"
-
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
-)
-
-// ArrayCodec is the Codec used for bsoncore.Array values.
-//
-// Deprecated: ArrayCodec will not be directly accessible in Go Driver 2.0.
-type ArrayCodec struct{}
-
-var defaultArrayCodec = NewArrayCodec()
-
-// NewArrayCodec returns an ArrayCodec.
-//
-// Deprecated: NewArrayCodec will not be available in Go Driver 2.0. See
-// [ArrayCodec] for more details.
-func NewArrayCodec() *ArrayCodec {
- return &ArrayCodec{}
-}
-
-// EncodeValue is the ValueEncoder for bsoncore.Array values.
-func (ac *ArrayCodec) EncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tCoreArray {
- return ValueEncoderError{Name: "CoreArrayEncodeValue", Types: []reflect.Type{tCoreArray}, Received: val}
- }
-
- arr := val.Interface().(bsoncore.Array)
- return bsonrw.Copier{}.CopyArrayFromBytes(vw, arr)
-}
-
-// DecodeValue is the ValueDecoder for bsoncore.Array values.
-func (ac *ArrayCodec) DecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tCoreArray {
- return ValueDecoderError{Name: "CoreArrayDecodeValue", Types: []reflect.Type{tCoreArray}, Received: val}
- }
-
- if val.IsNil() {
- val.Set(reflect.MakeSlice(val.Type(), 0, 0))
- }
-
- val.SetLen(0)
- arr, err := bsonrw.Copier{}.AppendArrayBytes(val.Interface().(bsoncore.Array), vr)
- val.Set(reflect.ValueOf(arr))
- return err
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/bsoncodec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/bsoncodec.go
deleted file mode 100644
index 0693bd432..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/bsoncodec.go
+++ /dev/null
@@ -1,382 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec // import "go.mongodb.org/mongo-driver/bson/bsoncodec"
-
-import (
- "fmt"
- "reflect"
- "strings"
-
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
- "go.mongodb.org/mongo-driver/bson/primitive"
-)
-
-var (
- emptyValue = reflect.Value{}
-)
-
-// Marshaler is an interface implemented by types that can marshal themselves
-// into a BSON document represented as bytes. The bytes returned must be a valid
-// BSON document if the error is nil.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Marshaler] instead.
-type Marshaler interface {
- MarshalBSON() ([]byte, error)
-}
-
-// ValueMarshaler is an interface implemented by types that can marshal
-// themselves into a BSON value as bytes. The type must be the valid type for
-// the bytes returned. The bytes and byte type together must be valid if the
-// error is nil.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.ValueMarshaler] instead.
-type ValueMarshaler interface {
- MarshalBSONValue() (bsontype.Type, []byte, error)
-}
-
-// Unmarshaler is an interface implemented by types that can unmarshal a BSON
-// document representation of themselves. The BSON bytes can be assumed to be
-// valid. UnmarshalBSON must copy the BSON bytes if it wishes to retain the data
-// after returning.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Unmarshaler] instead.
-type Unmarshaler interface {
- UnmarshalBSON([]byte) error
-}
-
-// ValueUnmarshaler is an interface implemented by types that can unmarshal a
-// BSON value representation of themselves. The BSON bytes and type can be
-// assumed to be valid. UnmarshalBSONValue must copy the BSON value bytes if it
-// wishes to retain the data after returning.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.ValueUnmarshaler] instead.
-type ValueUnmarshaler interface {
- UnmarshalBSONValue(bsontype.Type, []byte) error
-}
-
-// ValueEncoderError is an error returned from a ValueEncoder when the provided value can't be
-// encoded by the ValueEncoder.
-type ValueEncoderError struct {
- Name string
- Types []reflect.Type
- Kinds []reflect.Kind
- Received reflect.Value
-}
-
-func (vee ValueEncoderError) Error() string {
- typeKinds := make([]string, 0, len(vee.Types)+len(vee.Kinds))
- for _, t := range vee.Types {
- typeKinds = append(typeKinds, t.String())
- }
- for _, k := range vee.Kinds {
- if k == reflect.Map {
- typeKinds = append(typeKinds, "map[string]*")
- continue
- }
- typeKinds = append(typeKinds, k.String())
- }
- received := vee.Received.Kind().String()
- if vee.Received.IsValid() {
- received = vee.Received.Type().String()
- }
- return fmt.Sprintf("%s can only encode valid %s, but got %s", vee.Name, strings.Join(typeKinds, ", "), received)
-}
-
-// ValueDecoderError is an error returned from a ValueDecoder when the provided value can't be
-// decoded by the ValueDecoder.
-type ValueDecoderError struct {
- Name string
- Types []reflect.Type
- Kinds []reflect.Kind
- Received reflect.Value
-}
-
-func (vde ValueDecoderError) Error() string {
- typeKinds := make([]string, 0, len(vde.Types)+len(vde.Kinds))
- for _, t := range vde.Types {
- typeKinds = append(typeKinds, t.String())
- }
- for _, k := range vde.Kinds {
- if k == reflect.Map {
- typeKinds = append(typeKinds, "map[string]*")
- continue
- }
- typeKinds = append(typeKinds, k.String())
- }
- received := vde.Received.Kind().String()
- if vde.Received.IsValid() {
- received = vde.Received.Type().String()
- }
- return fmt.Sprintf("%s can only decode valid and settable %s, but got %s", vde.Name, strings.Join(typeKinds, ", "), received)
-}
-
-// EncodeContext is the contextual information required for a Codec to encode a
-// value.
-type EncodeContext struct {
- *Registry
-
- // MinSize causes the Encoder to marshal Go integer values (int, int8, int16, int32, int64,
- // uint, uint8, uint16, uint32, or uint64) as the minimum BSON int size (either 32 or 64 bits)
- // that can represent the integer value.
- //
- // Deprecated: Use bson.Encoder.IntMinSize instead.
- MinSize bool
-
- errorOnInlineDuplicates bool
- stringifyMapKeysWithFmt bool
- nilMapAsEmpty bool
- nilSliceAsEmpty bool
- nilByteSliceAsEmpty bool
- omitZeroStruct bool
- useJSONStructTags bool
-}
-
-// ErrorOnInlineDuplicates causes the Encoder to return an error if there is a duplicate field in
-// the marshaled BSON when the "inline" struct tag option is set.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Encoder.ErrorOnInlineDuplicates] instead.
-func (ec *EncodeContext) ErrorOnInlineDuplicates() {
- ec.errorOnInlineDuplicates = true
-}
-
-// StringifyMapKeysWithFmt causes the Encoder to convert Go map keys to BSON document field name
-// strings using fmt.Sprintf() instead of the default string conversion logic.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Encoder.StringifyMapKeysWithFmt] instead.
-func (ec *EncodeContext) StringifyMapKeysWithFmt() {
- ec.stringifyMapKeysWithFmt = true
-}
-
-// NilMapAsEmpty causes the Encoder to marshal nil Go maps as empty BSON documents instead of BSON
-// null.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Encoder.NilMapAsEmpty] instead.
-func (ec *EncodeContext) NilMapAsEmpty() {
- ec.nilMapAsEmpty = true
-}
-
-// NilSliceAsEmpty causes the Encoder to marshal nil Go slices as empty BSON arrays instead of BSON
-// null.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Encoder.NilSliceAsEmpty] instead.
-func (ec *EncodeContext) NilSliceAsEmpty() {
- ec.nilSliceAsEmpty = true
-}
-
-// NilByteSliceAsEmpty causes the Encoder to marshal nil Go byte slices as empty BSON binary values
-// instead of BSON null.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Encoder.NilByteSliceAsEmpty] instead.
-func (ec *EncodeContext) NilByteSliceAsEmpty() {
- ec.nilByteSliceAsEmpty = true
-}
-
-// OmitZeroStruct causes the Encoder to consider the zero value for a struct (e.g. MyStruct{})
-// as empty and omit it from the marshaled BSON when the "omitempty" struct tag option is set.
-//
-// Note that the Encoder only examines exported struct fields when determining if a struct is the
-// zero value. It considers pointers to a zero struct value (e.g. &MyStruct{}) not empty.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Encoder.OmitZeroStruct] instead.
-func (ec *EncodeContext) OmitZeroStruct() {
- ec.omitZeroStruct = true
-}
-
-// UseJSONStructTags causes the Encoder to fall back to using the "json" struct tag if a "bson"
-// struct tag is not specified.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Encoder.UseJSONStructTags] instead.
-func (ec *EncodeContext) UseJSONStructTags() {
- ec.useJSONStructTags = true
-}
-
-// DecodeContext is the contextual information required for a Codec to decode a
-// value.
-type DecodeContext struct {
- *Registry
-
- // Truncate, if true, instructs decoders to to truncate the fractional part of BSON "double"
- // values when attempting to unmarshal them into a Go integer (int, int8, int16, int32, int64,
- // uint, uint8, uint16, uint32, or uint64) struct field. The truncation logic does not apply to
- // BSON "decimal128" values.
- //
- // Deprecated: Use bson.Decoder.AllowTruncatingDoubles instead.
- Truncate bool
-
- // Ancestor is the type of a containing document. This is mainly used to determine what type
- // should be used when decoding an embedded document into an empty interface. For example, if
- // Ancestor is a bson.M, BSON embedded document values being decoded into an empty interface
- // will be decoded into a bson.M.
- //
- // Deprecated: Use bson.Decoder.DefaultDocumentM or bson.Decoder.DefaultDocumentD instead.
- Ancestor reflect.Type
-
- // defaultDocumentType specifies the Go type to decode top-level and nested BSON documents into. In particular, the
- // usage for this field is restricted to data typed as "interface{}" or "map[string]interface{}". If DocumentType is
- // set to a type that a BSON document cannot be unmarshaled into (e.g. "string"), unmarshalling will result in an
- // error. DocumentType overrides the Ancestor field.
- defaultDocumentType reflect.Type
-
- binaryAsSlice bool
- useJSONStructTags bool
- useLocalTimeZone bool
- zeroMaps bool
- zeroStructs bool
-}
-
-// BinaryAsSlice causes the Decoder to unmarshal BSON binary field values that are the "Generic" or
-// "Old" BSON binary subtype as a Go byte slice instead of a primitive.Binary.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Decoder.BinaryAsSlice] instead.
-func (dc *DecodeContext) BinaryAsSlice() {
- dc.binaryAsSlice = true
-}
-
-// UseJSONStructTags causes the Decoder to fall back to using the "json" struct tag if a "bson"
-// struct tag is not specified.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Decoder.UseJSONStructTags] instead.
-func (dc *DecodeContext) UseJSONStructTags() {
- dc.useJSONStructTags = true
-}
-
-// UseLocalTimeZone causes the Decoder to unmarshal time.Time values in the local timezone instead
-// of the UTC timezone.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Decoder.UseLocalTimeZone] instead.
-func (dc *DecodeContext) UseLocalTimeZone() {
- dc.useLocalTimeZone = true
-}
-
-// ZeroMaps causes the Decoder to delete any existing values from Go maps in the destination value
-// passed to Decode before unmarshaling BSON documents into them.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Decoder.ZeroMaps] instead.
-func (dc *DecodeContext) ZeroMaps() {
- dc.zeroMaps = true
-}
-
-// ZeroStructs causes the Decoder to delete any existing values from Go structs in the destination
-// value passed to Decode before unmarshaling BSON documents into them.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Decoder.ZeroStructs] instead.
-func (dc *DecodeContext) ZeroStructs() {
- dc.zeroStructs = true
-}
-
-// DefaultDocumentM causes the Decoder to always unmarshal documents into the primitive.M type. This
-// behavior is restricted to data typed as "interface{}" or "map[string]interface{}".
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Decoder.DefaultDocumentM] instead.
-func (dc *DecodeContext) DefaultDocumentM() {
- dc.defaultDocumentType = reflect.TypeOf(primitive.M{})
-}
-
-// DefaultDocumentD causes the Decoder to always unmarshal documents into the primitive.D type. This
-// behavior is restricted to data typed as "interface{}" or "map[string]interface{}".
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Decoder.DefaultDocumentD] instead.
-func (dc *DecodeContext) DefaultDocumentD() {
- dc.defaultDocumentType = reflect.TypeOf(primitive.D{})
-}
-
-// ValueCodec is an interface for encoding and decoding a reflect.Value.
-// values.
-//
-// Deprecated: Use [ValueEncoder] and [ValueDecoder] instead.
-type ValueCodec interface {
- ValueEncoder
- ValueDecoder
-}
-
-// ValueEncoder is the interface implemented by types that can handle the encoding of a value.
-type ValueEncoder interface {
- EncodeValue(EncodeContext, bsonrw.ValueWriter, reflect.Value) error
-}
-
-// ValueEncoderFunc is an adapter function that allows a function with the correct signature to be
-// used as a ValueEncoder.
-type ValueEncoderFunc func(EncodeContext, bsonrw.ValueWriter, reflect.Value) error
-
-// EncodeValue implements the ValueEncoder interface.
-func (fn ValueEncoderFunc) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- return fn(ec, vw, val)
-}
-
-// ValueDecoder is the interface implemented by types that can handle the decoding of a value.
-type ValueDecoder interface {
- DecodeValue(DecodeContext, bsonrw.ValueReader, reflect.Value) error
-}
-
-// ValueDecoderFunc is an adapter function that allows a function with the correct signature to be
-// used as a ValueDecoder.
-type ValueDecoderFunc func(DecodeContext, bsonrw.ValueReader, reflect.Value) error
-
-// DecodeValue implements the ValueDecoder interface.
-func (fn ValueDecoderFunc) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- return fn(dc, vr, val)
-}
-
-// typeDecoder is the interface implemented by types that can handle the decoding of a value given its type.
-type typeDecoder interface {
- decodeType(DecodeContext, bsonrw.ValueReader, reflect.Type) (reflect.Value, error)
-}
-
-// typeDecoderFunc is an adapter function that allows a function with the correct signature to be used as a typeDecoder.
-type typeDecoderFunc func(DecodeContext, bsonrw.ValueReader, reflect.Type) (reflect.Value, error)
-
-func (fn typeDecoderFunc) decodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- return fn(dc, vr, t)
-}
-
-// decodeAdapter allows two functions with the correct signatures to be used as both a ValueDecoder and typeDecoder.
-type decodeAdapter struct {
- ValueDecoderFunc
- typeDecoderFunc
-}
-
-var _ ValueDecoder = decodeAdapter{}
-var _ typeDecoder = decodeAdapter{}
-
-// decodeTypeOrValue calls decoder.decodeType is decoder is a typeDecoder. Otherwise, it allocates a new element of type
-// t and calls decoder.DecodeValue on it.
-func decodeTypeOrValue(decoder ValueDecoder, dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- td, _ := decoder.(typeDecoder)
- return decodeTypeOrValueWithInfo(decoder, td, dc, vr, t, true)
-}
-
-func decodeTypeOrValueWithInfo(vd ValueDecoder, td typeDecoder, dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type, convert bool) (reflect.Value, error) {
- if td != nil {
- val, err := td.decodeType(dc, vr, t)
- if err == nil && convert && val.Type() != t {
- // This conversion step is necessary for slices and maps. If a user declares variables like:
- //
- // type myBool bool
- // var m map[string]myBool
- //
- // and tries to decode BSON bytes into the map, the decoding will fail if this conversion is not present
- // because we'll try to assign a value of type bool to one of type myBool.
- val = val.Convert(t)
- }
- return val, err
- }
-
- val := reflect.New(t).Elem()
- err := vd.DecodeValue(dc, vr, val)
- return val, err
-}
-
-// CodecZeroer is the interface implemented by Codecs that can also determine if
-// a value of the type that would be encoded is zero.
-//
-// Deprecated: Defining custom rules for the zero/empty value will not be supported in Go Driver
-// 2.0. Users who want to omit empty complex values should use a pointer field and set the value to
-// nil instead.
-type CodecZeroer interface {
- IsTypeZero(interface{}) bool
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/byte_slice_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/byte_slice_codec.go
deleted file mode 100644
index 0134b5a94..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/byte_slice_codec.go
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "fmt"
- "reflect"
-
- "go.mongodb.org/mongo-driver/bson/bsonoptions"
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
-)
-
-// ByteSliceCodec is the Codec used for []byte values.
-//
-// Deprecated: ByteSliceCodec will not be directly configurable in Go Driver
-// 2.0. To configure the byte slice encode and decode behavior, use the
-// configuration methods on a [go.mongodb.org/mongo-driver/bson.Encoder] or
-// [go.mongodb.org/mongo-driver/bson.Decoder]. To configure the byte slice
-// encode and decode behavior for a mongo.Client, use
-// [go.mongodb.org/mongo-driver/mongo/options.ClientOptions.SetBSONOptions].
-//
-// For example, to configure a mongo.Client to encode nil byte slices as empty
-// BSON binary values, use:
-//
-// opt := options.Client().SetBSONOptions(&options.BSONOptions{
-// NilByteSliceAsEmpty: true,
-// })
-//
-// See the deprecation notice for each field in ByteSliceCodec for the
-// corresponding settings.
-type ByteSliceCodec struct {
- // EncodeNilAsEmpty causes EncodeValue to marshal nil Go byte slices as empty BSON binary values
- // instead of BSON null.
- //
- // Deprecated: Use bson.Encoder.NilByteSliceAsEmpty or options.BSONOptions.NilByteSliceAsEmpty
- // instead.
- EncodeNilAsEmpty bool
-}
-
-var (
- defaultByteSliceCodec = NewByteSliceCodec()
-
- // Assert that defaultByteSliceCodec satisfies the typeDecoder interface, which allows it to be
- // used by collection type decoders (e.g. map, slice, etc) to set individual values in a
- // collection.
- _ typeDecoder = defaultByteSliceCodec
-)
-
-// NewByteSliceCodec returns a ByteSliceCodec with options opts.
-//
-// Deprecated: NewByteSliceCodec will not be available in Go Driver 2.0. See
-// [ByteSliceCodec] for more details.
-func NewByteSliceCodec(opts ...*bsonoptions.ByteSliceCodecOptions) *ByteSliceCodec {
- byteSliceOpt := bsonoptions.MergeByteSliceCodecOptions(opts...)
- codec := ByteSliceCodec{}
- if byteSliceOpt.EncodeNilAsEmpty != nil {
- codec.EncodeNilAsEmpty = *byteSliceOpt.EncodeNilAsEmpty
- }
- return &codec
-}
-
-// EncodeValue is the ValueEncoder for []byte.
-func (bsc *ByteSliceCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tByteSlice {
- return ValueEncoderError{Name: "ByteSliceEncodeValue", Types: []reflect.Type{tByteSlice}, Received: val}
- }
- if val.IsNil() && !bsc.EncodeNilAsEmpty && !ec.nilByteSliceAsEmpty {
- return vw.WriteNull()
- }
- return vw.WriteBinary(val.Interface().([]byte))
-}
-
-func (bsc *ByteSliceCodec) decodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tByteSlice {
- return emptyValue, ValueDecoderError{
- Name: "ByteSliceDecodeValue",
- Types: []reflect.Type{tByteSlice},
- Received: reflect.Zero(t),
- }
- }
-
- var data []byte
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.String:
- str, err := vr.ReadString()
- if err != nil {
- return emptyValue, err
- }
- data = []byte(str)
- case bsontype.Symbol:
- sym, err := vr.ReadSymbol()
- if err != nil {
- return emptyValue, err
- }
- data = []byte(sym)
- case bsontype.Binary:
- var subtype byte
- data, subtype, err = vr.ReadBinary()
- if err != nil {
- return emptyValue, err
- }
- if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld {
- return emptyValue, decodeBinaryError{subtype: subtype, typeName: "[]byte"}
- }
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a []byte", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(data), nil
-}
-
-// DecodeValue is the ValueDecoder for []byte.
-func (bsc *ByteSliceCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tByteSlice {
- return ValueDecoderError{Name: "ByteSliceDecodeValue", Types: []reflect.Type{tByteSlice}, Received: val}
- }
-
- elem, err := bsc.decodeType(dc, vr, tByteSlice)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/codec_cache.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/codec_cache.go
deleted file mode 100644
index 844b50299..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/codec_cache.go
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "reflect"
- "sync"
- "sync/atomic"
-)
-
-// Runtime check that the kind encoder and decoder caches can store any valid
-// reflect.Kind constant.
-func init() {
- if s := reflect.Kind(len(kindEncoderCache{}.entries)).String(); s != "kind27" {
- panic("The capacity of kindEncoderCache is too small.\n" +
- "This is due to a new type being added to reflect.Kind.")
- }
-}
-
-// statically assert array size
-var _ = (kindEncoderCache{}).entries[reflect.UnsafePointer]
-var _ = (kindDecoderCache{}).entries[reflect.UnsafePointer]
-
-type typeEncoderCache struct {
- cache sync.Map // map[reflect.Type]ValueEncoder
-}
-
-func (c *typeEncoderCache) Store(rt reflect.Type, enc ValueEncoder) {
- c.cache.Store(rt, enc)
-}
-
-func (c *typeEncoderCache) Load(rt reflect.Type) (ValueEncoder, bool) {
- if v, _ := c.cache.Load(rt); v != nil {
- return v.(ValueEncoder), true
- }
- return nil, false
-}
-
-func (c *typeEncoderCache) LoadOrStore(rt reflect.Type, enc ValueEncoder) ValueEncoder {
- if v, loaded := c.cache.LoadOrStore(rt, enc); loaded {
- enc = v.(ValueEncoder)
- }
- return enc
-}
-
-func (c *typeEncoderCache) Clone() *typeEncoderCache {
- cc := new(typeEncoderCache)
- c.cache.Range(func(k, v interface{}) bool {
- if k != nil && v != nil {
- cc.cache.Store(k, v)
- }
- return true
- })
- return cc
-}
-
-type typeDecoderCache struct {
- cache sync.Map // map[reflect.Type]ValueDecoder
-}
-
-func (c *typeDecoderCache) Store(rt reflect.Type, dec ValueDecoder) {
- c.cache.Store(rt, dec)
-}
-
-func (c *typeDecoderCache) Load(rt reflect.Type) (ValueDecoder, bool) {
- if v, _ := c.cache.Load(rt); v != nil {
- return v.(ValueDecoder), true
- }
- return nil, false
-}
-
-func (c *typeDecoderCache) LoadOrStore(rt reflect.Type, dec ValueDecoder) ValueDecoder {
- if v, loaded := c.cache.LoadOrStore(rt, dec); loaded {
- dec = v.(ValueDecoder)
- }
- return dec
-}
-
-func (c *typeDecoderCache) Clone() *typeDecoderCache {
- cc := new(typeDecoderCache)
- c.cache.Range(func(k, v interface{}) bool {
- if k != nil && v != nil {
- cc.cache.Store(k, v)
- }
- return true
- })
- return cc
-}
-
-// atomic.Value requires that all calls to Store() have the same concrete type
-// so we wrap the ValueEncoder with a kindEncoderCacheEntry to ensure the type
-// is always the same (since different concrete types may implement the
-// ValueEncoder interface).
-type kindEncoderCacheEntry struct {
- enc ValueEncoder
-}
-
-type kindEncoderCache struct {
- entries [reflect.UnsafePointer + 1]atomic.Value // *kindEncoderCacheEntry
-}
-
-func (c *kindEncoderCache) Store(rt reflect.Kind, enc ValueEncoder) {
- if enc != nil && rt < reflect.Kind(len(c.entries)) {
- c.entries[rt].Store(&kindEncoderCacheEntry{enc: enc})
- }
-}
-
-func (c *kindEncoderCache) Load(rt reflect.Kind) (ValueEncoder, bool) {
- if rt < reflect.Kind(len(c.entries)) {
- if ent, ok := c.entries[rt].Load().(*kindEncoderCacheEntry); ok {
- return ent.enc, ent.enc != nil
- }
- }
- return nil, false
-}
-
-func (c *kindEncoderCache) Clone() *kindEncoderCache {
- cc := new(kindEncoderCache)
- for i, v := range c.entries {
- if val := v.Load(); val != nil {
- cc.entries[i].Store(val)
- }
- }
- return cc
-}
-
-// atomic.Value requires that all calls to Store() have the same concrete type
-// so we wrap the ValueDecoder with a kindDecoderCacheEntry to ensure the type
-// is always the same (since different concrete types may implement the
-// ValueDecoder interface).
-type kindDecoderCacheEntry struct {
- dec ValueDecoder
-}
-
-type kindDecoderCache struct {
- entries [reflect.UnsafePointer + 1]atomic.Value // *kindDecoderCacheEntry
-}
-
-func (c *kindDecoderCache) Store(rt reflect.Kind, dec ValueDecoder) {
- if rt < reflect.Kind(len(c.entries)) {
- c.entries[rt].Store(&kindDecoderCacheEntry{dec: dec})
- }
-}
-
-func (c *kindDecoderCache) Load(rt reflect.Kind) (ValueDecoder, bool) {
- if rt < reflect.Kind(len(c.entries)) {
- if ent, ok := c.entries[rt].Load().(*kindDecoderCacheEntry); ok {
- return ent.dec, ent.dec != nil
- }
- }
- return nil, false
-}
-
-func (c *kindDecoderCache) Clone() *kindDecoderCache {
- cc := new(kindDecoderCache)
- for i, v := range c.entries {
- if val := v.Load(); val != nil {
- cc.entries[i].Store(val)
- }
- }
- return cc
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/cond_addr_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/cond_addr_codec.go
deleted file mode 100644
index cb8180f25..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/cond_addr_codec.go
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "reflect"
-
- "go.mongodb.org/mongo-driver/bson/bsonrw"
-)
-
-// condAddrEncoder is the encoder used when a pointer to the encoding value has an encoder.
-type condAddrEncoder struct {
- canAddrEnc ValueEncoder
- elseEnc ValueEncoder
-}
-
-var _ ValueEncoder = (*condAddrEncoder)(nil)
-
-// newCondAddrEncoder returns an condAddrEncoder.
-func newCondAddrEncoder(canAddrEnc, elseEnc ValueEncoder) *condAddrEncoder {
- encoder := condAddrEncoder{canAddrEnc: canAddrEnc, elseEnc: elseEnc}
- return &encoder
-}
-
-// EncodeValue is the ValueEncoderFunc for a value that may be addressable.
-func (cae *condAddrEncoder) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if val.CanAddr() {
- return cae.canAddrEnc.EncodeValue(ec, vw, val)
- }
- if cae.elseEnc != nil {
- return cae.elseEnc.EncodeValue(ec, vw, val)
- }
- return ErrNoEncoder{Type: val.Type()}
-}
-
-// condAddrDecoder is the decoder used when a pointer to the value has a decoder.
-type condAddrDecoder struct {
- canAddrDec ValueDecoder
- elseDec ValueDecoder
-}
-
-var _ ValueDecoder = (*condAddrDecoder)(nil)
-
-// newCondAddrDecoder returns an CondAddrDecoder.
-func newCondAddrDecoder(canAddrDec, elseDec ValueDecoder) *condAddrDecoder {
- decoder := condAddrDecoder{canAddrDec: canAddrDec, elseDec: elseDec}
- return &decoder
-}
-
-// DecodeValue is the ValueDecoderFunc for a value that may be addressable.
-func (cad *condAddrDecoder) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if val.CanAddr() {
- return cad.canAddrDec.DecodeValue(dc, vr, val)
- }
- if cad.elseDec != nil {
- return cad.elseDec.DecodeValue(dc, vr, val)
- }
- return ErrNoDecoder{Type: val.Type()}
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go
deleted file mode 100644
index 7e08aab35..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_decoders.go
+++ /dev/null
@@ -1,1807 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "encoding/json"
- "errors"
- "fmt"
- "math"
- "net/url"
- "reflect"
- "strconv"
- "time"
-
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
- "go.mongodb.org/mongo-driver/bson/primitive"
- "go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
-)
-
-var (
- defaultValueDecoders DefaultValueDecoders
- errCannotTruncate = errors.New("float64 can only be truncated to a lower precision type when truncation is enabled")
-)
-
-type decodeBinaryError struct {
- subtype byte
- typeName string
-}
-
-func (d decodeBinaryError) Error() string {
- return fmt.Sprintf("only binary values with subtype 0x00 or 0x02 can be decoded into %s, but got subtype %v", d.typeName, d.subtype)
-}
-
-func newDefaultStructCodec() *StructCodec {
- codec, err := NewStructCodec(DefaultStructTagParser)
- if err != nil {
- // This function is called from the codec registration path, so errors can't be propagated. If there's an error
- // constructing the StructCodec, we panic to avoid losing it.
- panic(fmt.Errorf("error creating default StructCodec: %w", err))
- }
- return codec
-}
-
-// DefaultValueDecoders is a namespace type for the default ValueDecoders used
-// when creating a registry.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-type DefaultValueDecoders struct{}
-
-// RegisterDefaultDecoders will register the decoder methods attached to DefaultValueDecoders with
-// the provided RegistryBuilder.
-//
-// There is no support for decoding map[string]interface{} because there is no decoder for
-// interface{}, so users must either register this decoder themselves or use the
-// EmptyInterfaceDecoder available in the bson package.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) RegisterDefaultDecoders(rb *RegistryBuilder) {
- if rb == nil {
- panic(errors.New("argument to RegisterDefaultDecoders must not be nil"))
- }
-
- intDecoder := decodeAdapter{dvd.IntDecodeValue, dvd.intDecodeType}
- floatDecoder := decodeAdapter{dvd.FloatDecodeValue, dvd.floatDecodeType}
-
- rb.
- RegisterTypeDecoder(tD, ValueDecoderFunc(dvd.DDecodeValue)).
- RegisterTypeDecoder(tBinary, decodeAdapter{dvd.BinaryDecodeValue, dvd.binaryDecodeType}).
- RegisterTypeDecoder(tUndefined, decodeAdapter{dvd.UndefinedDecodeValue, dvd.undefinedDecodeType}).
- RegisterTypeDecoder(tDateTime, decodeAdapter{dvd.DateTimeDecodeValue, dvd.dateTimeDecodeType}).
- RegisterTypeDecoder(tNull, decodeAdapter{dvd.NullDecodeValue, dvd.nullDecodeType}).
- RegisterTypeDecoder(tRegex, decodeAdapter{dvd.RegexDecodeValue, dvd.regexDecodeType}).
- RegisterTypeDecoder(tDBPointer, decodeAdapter{dvd.DBPointerDecodeValue, dvd.dBPointerDecodeType}).
- RegisterTypeDecoder(tTimestamp, decodeAdapter{dvd.TimestampDecodeValue, dvd.timestampDecodeType}).
- RegisterTypeDecoder(tMinKey, decodeAdapter{dvd.MinKeyDecodeValue, dvd.minKeyDecodeType}).
- RegisterTypeDecoder(tMaxKey, decodeAdapter{dvd.MaxKeyDecodeValue, dvd.maxKeyDecodeType}).
- RegisterTypeDecoder(tJavaScript, decodeAdapter{dvd.JavaScriptDecodeValue, dvd.javaScriptDecodeType}).
- RegisterTypeDecoder(tSymbol, decodeAdapter{dvd.SymbolDecodeValue, dvd.symbolDecodeType}).
- RegisterTypeDecoder(tByteSlice, defaultByteSliceCodec).
- RegisterTypeDecoder(tTime, defaultTimeCodec).
- RegisterTypeDecoder(tEmpty, defaultEmptyInterfaceCodec).
- RegisterTypeDecoder(tCoreArray, defaultArrayCodec).
- RegisterTypeDecoder(tOID, decodeAdapter{dvd.ObjectIDDecodeValue, dvd.objectIDDecodeType}).
- RegisterTypeDecoder(tDecimal, decodeAdapter{dvd.Decimal128DecodeValue, dvd.decimal128DecodeType}).
- RegisterTypeDecoder(tJSONNumber, decodeAdapter{dvd.JSONNumberDecodeValue, dvd.jsonNumberDecodeType}).
- RegisterTypeDecoder(tURL, decodeAdapter{dvd.URLDecodeValue, dvd.urlDecodeType}).
- RegisterTypeDecoder(tCoreDocument, ValueDecoderFunc(dvd.CoreDocumentDecodeValue)).
- RegisterTypeDecoder(tCodeWithScope, decodeAdapter{dvd.CodeWithScopeDecodeValue, dvd.codeWithScopeDecodeType}).
- RegisterDefaultDecoder(reflect.Bool, decodeAdapter{dvd.BooleanDecodeValue, dvd.booleanDecodeType}).
- RegisterDefaultDecoder(reflect.Int, intDecoder).
- RegisterDefaultDecoder(reflect.Int8, intDecoder).
- RegisterDefaultDecoder(reflect.Int16, intDecoder).
- RegisterDefaultDecoder(reflect.Int32, intDecoder).
- RegisterDefaultDecoder(reflect.Int64, intDecoder).
- RegisterDefaultDecoder(reflect.Uint, defaultUIntCodec).
- RegisterDefaultDecoder(reflect.Uint8, defaultUIntCodec).
- RegisterDefaultDecoder(reflect.Uint16, defaultUIntCodec).
- RegisterDefaultDecoder(reflect.Uint32, defaultUIntCodec).
- RegisterDefaultDecoder(reflect.Uint64, defaultUIntCodec).
- RegisterDefaultDecoder(reflect.Float32, floatDecoder).
- RegisterDefaultDecoder(reflect.Float64, floatDecoder).
- RegisterDefaultDecoder(reflect.Array, ValueDecoderFunc(dvd.ArrayDecodeValue)).
- RegisterDefaultDecoder(reflect.Map, defaultMapCodec).
- RegisterDefaultDecoder(reflect.Slice, defaultSliceCodec).
- RegisterDefaultDecoder(reflect.String, defaultStringCodec).
- RegisterDefaultDecoder(reflect.Struct, newDefaultStructCodec()).
- RegisterDefaultDecoder(reflect.Ptr, NewPointerCodec()).
- RegisterTypeMapEntry(bsontype.Double, tFloat64).
- RegisterTypeMapEntry(bsontype.String, tString).
- RegisterTypeMapEntry(bsontype.Array, tA).
- RegisterTypeMapEntry(bsontype.Binary, tBinary).
- RegisterTypeMapEntry(bsontype.Undefined, tUndefined).
- RegisterTypeMapEntry(bsontype.ObjectID, tOID).
- RegisterTypeMapEntry(bsontype.Boolean, tBool).
- RegisterTypeMapEntry(bsontype.DateTime, tDateTime).
- RegisterTypeMapEntry(bsontype.Regex, tRegex).
- RegisterTypeMapEntry(bsontype.DBPointer, tDBPointer).
- RegisterTypeMapEntry(bsontype.JavaScript, tJavaScript).
- RegisterTypeMapEntry(bsontype.Symbol, tSymbol).
- RegisterTypeMapEntry(bsontype.CodeWithScope, tCodeWithScope).
- RegisterTypeMapEntry(bsontype.Int32, tInt32).
- RegisterTypeMapEntry(bsontype.Int64, tInt64).
- RegisterTypeMapEntry(bsontype.Timestamp, tTimestamp).
- RegisterTypeMapEntry(bsontype.Decimal128, tDecimal).
- RegisterTypeMapEntry(bsontype.MinKey, tMinKey).
- RegisterTypeMapEntry(bsontype.MaxKey, tMaxKey).
- RegisterTypeMapEntry(bsontype.Type(0), tD).
- RegisterTypeMapEntry(bsontype.EmbeddedDocument, tD).
- RegisterHookDecoder(tValueUnmarshaler, ValueDecoderFunc(dvd.ValueUnmarshalerDecodeValue)).
- RegisterHookDecoder(tUnmarshaler, ValueDecoderFunc(dvd.UnmarshalerDecodeValue))
-}
-
-// DDecodeValue is the ValueDecoderFunc for primitive.D instances.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) DDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.IsValid() || !val.CanSet() || val.Type() != tD {
- return ValueDecoderError{Name: "DDecodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val}
- }
-
- switch vrType := vr.Type(); vrType {
- case bsontype.Type(0), bsontype.EmbeddedDocument:
- dc.Ancestor = tD
- case bsontype.Null:
- val.Set(reflect.Zero(val.Type()))
- return vr.ReadNull()
- default:
- return fmt.Errorf("cannot decode %v into a primitive.D", vrType)
- }
-
- dr, err := vr.ReadDocument()
- if err != nil {
- return err
- }
-
- decoder, err := dc.LookupDecoder(tEmpty)
- if err != nil {
- return err
- }
- tEmptyTypeDecoder, _ := decoder.(typeDecoder)
-
- // Use the elements in the provided value if it's non nil. Otherwise, allocate a new D instance.
- var elems primitive.D
- if !val.IsNil() {
- val.SetLen(0)
- elems = val.Interface().(primitive.D)
- } else {
- elems = make(primitive.D, 0)
- }
-
- for {
- key, elemVr, err := dr.ReadElement()
- if errors.Is(err, bsonrw.ErrEOD) {
- break
- } else if err != nil {
- return err
- }
-
- // Pass false for convert because we don't need to call reflect.Value.Convert for tEmpty.
- elem, err := decodeTypeOrValueWithInfo(decoder, tEmptyTypeDecoder, dc, elemVr, tEmpty, false)
- if err != nil {
- return err
- }
-
- elems = append(elems, primitive.E{Key: key, Value: elem.Interface()})
- }
-
- val.Set(reflect.ValueOf(elems))
- return nil
-}
-
-func (dvd DefaultValueDecoders) booleanDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t.Kind() != reflect.Bool {
- return emptyValue, ValueDecoderError{
- Name: "BooleanDecodeValue",
- Kinds: []reflect.Kind{reflect.Bool},
- Received: reflect.Zero(t),
- }
- }
-
- var b bool
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.Int32:
- i32, err := vr.ReadInt32()
- if err != nil {
- return emptyValue, err
- }
- b = (i32 != 0)
- case bsontype.Int64:
- i64, err := vr.ReadInt64()
- if err != nil {
- return emptyValue, err
- }
- b = (i64 != 0)
- case bsontype.Double:
- f64, err := vr.ReadDouble()
- if err != nil {
- return emptyValue, err
- }
- b = (f64 != 0)
- case bsontype.Boolean:
- b, err = vr.ReadBoolean()
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a boolean", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(b), nil
-}
-
-// BooleanDecodeValue is the ValueDecoderFunc for bool types.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) BooleanDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.IsValid() || !val.CanSet() || val.Kind() != reflect.Bool {
- return ValueDecoderError{Name: "BooleanDecodeValue", Kinds: []reflect.Kind{reflect.Bool}, Received: val}
- }
-
- elem, err := dvd.booleanDecodeType(dctx, vr, val.Type())
- if err != nil {
- return err
- }
-
- val.SetBool(elem.Bool())
- return nil
-}
-
-func (DefaultValueDecoders) intDecodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- var i64 int64
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.Int32:
- i32, err := vr.ReadInt32()
- if err != nil {
- return emptyValue, err
- }
- i64 = int64(i32)
- case bsontype.Int64:
- i64, err = vr.ReadInt64()
- if err != nil {
- return emptyValue, err
- }
- case bsontype.Double:
- f64, err := vr.ReadDouble()
- if err != nil {
- return emptyValue, err
- }
- if !dc.Truncate && math.Floor(f64) != f64 {
- return emptyValue, errCannotTruncate
- }
- if f64 > float64(math.MaxInt64) {
- return emptyValue, fmt.Errorf("%g overflows int64", f64)
- }
- i64 = int64(f64)
- case bsontype.Boolean:
- b, err := vr.ReadBoolean()
- if err != nil {
- return emptyValue, err
- }
- if b {
- i64 = 1
- }
- case bsontype.Null:
- if err = vr.ReadNull(); err != nil {
- return emptyValue, err
- }
- case bsontype.Undefined:
- if err = vr.ReadUndefined(); err != nil {
- return emptyValue, err
- }
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into an integer type", vrType)
- }
-
- switch t.Kind() {
- case reflect.Int8:
- if i64 < math.MinInt8 || i64 > math.MaxInt8 {
- return emptyValue, fmt.Errorf("%d overflows int8", i64)
- }
-
- return reflect.ValueOf(int8(i64)), nil
- case reflect.Int16:
- if i64 < math.MinInt16 || i64 > math.MaxInt16 {
- return emptyValue, fmt.Errorf("%d overflows int16", i64)
- }
-
- return reflect.ValueOf(int16(i64)), nil
- case reflect.Int32:
- if i64 < math.MinInt32 || i64 > math.MaxInt32 {
- return emptyValue, fmt.Errorf("%d overflows int32", i64)
- }
-
- return reflect.ValueOf(int32(i64)), nil
- case reflect.Int64:
- return reflect.ValueOf(i64), nil
- case reflect.Int:
- if int64(int(i64)) != i64 { // Can we fit this inside of an int
- return emptyValue, fmt.Errorf("%d overflows int", i64)
- }
-
- return reflect.ValueOf(int(i64)), nil
- default:
- return emptyValue, ValueDecoderError{
- Name: "IntDecodeValue",
- Kinds: []reflect.Kind{reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int},
- Received: reflect.Zero(t),
- }
- }
-}
-
-// IntDecodeValue is the ValueDecoderFunc for int types.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) IntDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() {
- return ValueDecoderError{
- Name: "IntDecodeValue",
- Kinds: []reflect.Kind{reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int},
- Received: val,
- }
- }
-
- elem, err := dvd.intDecodeType(dc, vr, val.Type())
- if err != nil {
- return err
- }
-
- val.SetInt(elem.Int())
- return nil
-}
-
-// UintDecodeValue is the ValueDecoderFunc for uint types.
-//
-// Deprecated: UintDecodeValue is not registered by default. Use UintCodec.DecodeValue instead.
-func (dvd DefaultValueDecoders) UintDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- var i64 int64
- var err error
- switch vr.Type() {
- case bsontype.Int32:
- i32, err := vr.ReadInt32()
- if err != nil {
- return err
- }
- i64 = int64(i32)
- case bsontype.Int64:
- i64, err = vr.ReadInt64()
- if err != nil {
- return err
- }
- case bsontype.Double:
- f64, err := vr.ReadDouble()
- if err != nil {
- return err
- }
- if !dc.Truncate && math.Floor(f64) != f64 {
- return errors.New("UintDecodeValue can only truncate float64 to an integer type when truncation is enabled")
- }
- if f64 > float64(math.MaxInt64) {
- return fmt.Errorf("%g overflows int64", f64)
- }
- i64 = int64(f64)
- case bsontype.Boolean:
- b, err := vr.ReadBoolean()
- if err != nil {
- return err
- }
- if b {
- i64 = 1
- }
- default:
- return fmt.Errorf("cannot decode %v into an integer type", vr.Type())
- }
-
- if !val.CanSet() {
- return ValueDecoderError{
- Name: "UintDecodeValue",
- Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint},
- Received: val,
- }
- }
-
- switch val.Kind() {
- case reflect.Uint8:
- if i64 < 0 || i64 > math.MaxUint8 {
- return fmt.Errorf("%d overflows uint8", i64)
- }
- case reflect.Uint16:
- if i64 < 0 || i64 > math.MaxUint16 {
- return fmt.Errorf("%d overflows uint16", i64)
- }
- case reflect.Uint32:
- if i64 < 0 || i64 > math.MaxUint32 {
- return fmt.Errorf("%d overflows uint32", i64)
- }
- case reflect.Uint64:
- if i64 < 0 {
- return fmt.Errorf("%d overflows uint64", i64)
- }
- case reflect.Uint:
- if i64 < 0 || int64(uint(i64)) != i64 { // Can we fit this inside of an uint
- return fmt.Errorf("%d overflows uint", i64)
- }
- default:
- return ValueDecoderError{
- Name: "UintDecodeValue",
- Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint},
- Received: val,
- }
- }
-
- val.SetUint(uint64(i64))
- return nil
-}
-
-func (dvd DefaultValueDecoders) floatDecodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- var f float64
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.Int32:
- i32, err := vr.ReadInt32()
- if err != nil {
- return emptyValue, err
- }
- f = float64(i32)
- case bsontype.Int64:
- i64, err := vr.ReadInt64()
- if err != nil {
- return emptyValue, err
- }
- f = float64(i64)
- case bsontype.Double:
- f, err = vr.ReadDouble()
- if err != nil {
- return emptyValue, err
- }
- case bsontype.Boolean:
- b, err := vr.ReadBoolean()
- if err != nil {
- return emptyValue, err
- }
- if b {
- f = 1
- }
- case bsontype.Null:
- if err = vr.ReadNull(); err != nil {
- return emptyValue, err
- }
- case bsontype.Undefined:
- if err = vr.ReadUndefined(); err != nil {
- return emptyValue, err
- }
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a float32 or float64 type", vrType)
- }
-
- switch t.Kind() {
- case reflect.Float32:
- if !dc.Truncate && float64(float32(f)) != f {
- return emptyValue, errCannotTruncate
- }
-
- return reflect.ValueOf(float32(f)), nil
- case reflect.Float64:
- return reflect.ValueOf(f), nil
- default:
- return emptyValue, ValueDecoderError{
- Name: "FloatDecodeValue",
- Kinds: []reflect.Kind{reflect.Float32, reflect.Float64},
- Received: reflect.Zero(t),
- }
- }
-}
-
-// FloatDecodeValue is the ValueDecoderFunc for float types.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) FloatDecodeValue(ec DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() {
- return ValueDecoderError{
- Name: "FloatDecodeValue",
- Kinds: []reflect.Kind{reflect.Float32, reflect.Float64},
- Received: val,
- }
- }
-
- elem, err := dvd.floatDecodeType(ec, vr, val.Type())
- if err != nil {
- return err
- }
-
- val.SetFloat(elem.Float())
- return nil
-}
-
-// StringDecodeValue is the ValueDecoderFunc for string types.
-//
-// Deprecated: StringDecodeValue is not registered by default. Use StringCodec.DecodeValue instead.
-func (dvd DefaultValueDecoders) StringDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- var str string
- var err error
- switch vr.Type() {
- // TODO(GODRIVER-577): Handle JavaScript and Symbol BSON types when allowed.
- case bsontype.String:
- str, err = vr.ReadString()
- if err != nil {
- return err
- }
- default:
- return fmt.Errorf("cannot decode %v into a string type", vr.Type())
- }
- if !val.CanSet() || val.Kind() != reflect.String {
- return ValueDecoderError{Name: "StringDecodeValue", Kinds: []reflect.Kind{reflect.String}, Received: val}
- }
-
- val.SetString(str)
- return nil
-}
-
-func (DefaultValueDecoders) javaScriptDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tJavaScript {
- return emptyValue, ValueDecoderError{
- Name: "JavaScriptDecodeValue",
- Types: []reflect.Type{tJavaScript},
- Received: reflect.Zero(t),
- }
- }
-
- var js string
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.JavaScript:
- js, err = vr.ReadJavascript()
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a primitive.JavaScript", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(primitive.JavaScript(js)), nil
-}
-
-// JavaScriptDecodeValue is the ValueDecoderFunc for the primitive.JavaScript type.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) JavaScriptDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tJavaScript {
- return ValueDecoderError{Name: "JavaScriptDecodeValue", Types: []reflect.Type{tJavaScript}, Received: val}
- }
-
- elem, err := dvd.javaScriptDecodeType(dctx, vr, tJavaScript)
- if err != nil {
- return err
- }
-
- val.SetString(elem.String())
- return nil
-}
-
-func (DefaultValueDecoders) symbolDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tSymbol {
- return emptyValue, ValueDecoderError{
- Name: "SymbolDecodeValue",
- Types: []reflect.Type{tSymbol},
- Received: reflect.Zero(t),
- }
- }
-
- var symbol string
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.String:
- symbol, err = vr.ReadString()
- case bsontype.Symbol:
- symbol, err = vr.ReadSymbol()
- case bsontype.Binary:
- data, subtype, err := vr.ReadBinary()
- if err != nil {
- return emptyValue, err
- }
-
- if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld {
- return emptyValue, decodeBinaryError{subtype: subtype, typeName: "primitive.Symbol"}
- }
- symbol = string(data)
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a primitive.Symbol", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(primitive.Symbol(symbol)), nil
-}
-
-// SymbolDecodeValue is the ValueDecoderFunc for the primitive.Symbol type.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) SymbolDecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tSymbol {
- return ValueDecoderError{Name: "SymbolDecodeValue", Types: []reflect.Type{tSymbol}, Received: val}
- }
-
- elem, err := dvd.symbolDecodeType(dctx, vr, tSymbol)
- if err != nil {
- return err
- }
-
- val.SetString(elem.String())
- return nil
-}
-
-func (DefaultValueDecoders) binaryDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tBinary {
- return emptyValue, ValueDecoderError{
- Name: "BinaryDecodeValue",
- Types: []reflect.Type{tBinary},
- Received: reflect.Zero(t),
- }
- }
-
- var data []byte
- var subtype byte
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.Binary:
- data, subtype, err = vr.ReadBinary()
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a Binary", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(primitive.Binary{Subtype: subtype, Data: data}), nil
-}
-
-// BinaryDecodeValue is the ValueDecoderFunc for Binary.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) BinaryDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tBinary {
- return ValueDecoderError{Name: "BinaryDecodeValue", Types: []reflect.Type{tBinary}, Received: val}
- }
-
- elem, err := dvd.binaryDecodeType(dc, vr, tBinary)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (DefaultValueDecoders) undefinedDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tUndefined {
- return emptyValue, ValueDecoderError{
- Name: "UndefinedDecodeValue",
- Types: []reflect.Type{tUndefined},
- Received: reflect.Zero(t),
- }
- }
-
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- case bsontype.Null:
- err = vr.ReadNull()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into an Undefined", vr.Type())
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(primitive.Undefined{}), nil
-}
-
-// UndefinedDecodeValue is the ValueDecoderFunc for Undefined.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) UndefinedDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tUndefined {
- return ValueDecoderError{Name: "UndefinedDecodeValue", Types: []reflect.Type{tUndefined}, Received: val}
- }
-
- elem, err := dvd.undefinedDecodeType(dc, vr, tUndefined)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-// Accept both 12-byte string and pretty-printed 24-byte hex string formats.
-func (dvd DefaultValueDecoders) objectIDDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tOID {
- return emptyValue, ValueDecoderError{
- Name: "ObjectIDDecodeValue",
- Types: []reflect.Type{tOID},
- Received: reflect.Zero(t),
- }
- }
-
- var oid primitive.ObjectID
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.ObjectID:
- oid, err = vr.ReadObjectID()
- if err != nil {
- return emptyValue, err
- }
- case bsontype.String:
- str, err := vr.ReadString()
- if err != nil {
- return emptyValue, err
- }
- if oid, err = primitive.ObjectIDFromHex(str); err == nil {
- break
- }
- if len(str) != 12 {
- return emptyValue, fmt.Errorf("an ObjectID string must be exactly 12 bytes long (got %v)", len(str))
- }
- byteArr := []byte(str)
- copy(oid[:], byteArr)
- case bsontype.Null:
- if err = vr.ReadNull(); err != nil {
- return emptyValue, err
- }
- case bsontype.Undefined:
- if err = vr.ReadUndefined(); err != nil {
- return emptyValue, err
- }
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into an ObjectID", vrType)
- }
-
- return reflect.ValueOf(oid), nil
-}
-
-// ObjectIDDecodeValue is the ValueDecoderFunc for primitive.ObjectID.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) ObjectIDDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tOID {
- return ValueDecoderError{Name: "ObjectIDDecodeValue", Types: []reflect.Type{tOID}, Received: val}
- }
-
- elem, err := dvd.objectIDDecodeType(dc, vr, tOID)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (DefaultValueDecoders) dateTimeDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tDateTime {
- return emptyValue, ValueDecoderError{
- Name: "DateTimeDecodeValue",
- Types: []reflect.Type{tDateTime},
- Received: reflect.Zero(t),
- }
- }
-
- var dt int64
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.DateTime:
- dt, err = vr.ReadDateTime()
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a DateTime", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(primitive.DateTime(dt)), nil
-}
-
-// DateTimeDecodeValue is the ValueDecoderFunc for DateTime.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) DateTimeDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tDateTime {
- return ValueDecoderError{Name: "DateTimeDecodeValue", Types: []reflect.Type{tDateTime}, Received: val}
- }
-
- elem, err := dvd.dateTimeDecodeType(dc, vr, tDateTime)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (DefaultValueDecoders) nullDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tNull {
- return emptyValue, ValueDecoderError{
- Name: "NullDecodeValue",
- Types: []reflect.Type{tNull},
- Received: reflect.Zero(t),
- }
- }
-
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- case bsontype.Null:
- err = vr.ReadNull()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a Null", vr.Type())
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(primitive.Null{}), nil
-}
-
-// NullDecodeValue is the ValueDecoderFunc for Null.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) NullDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tNull {
- return ValueDecoderError{Name: "NullDecodeValue", Types: []reflect.Type{tNull}, Received: val}
- }
-
- elem, err := dvd.nullDecodeType(dc, vr, tNull)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (DefaultValueDecoders) regexDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tRegex {
- return emptyValue, ValueDecoderError{
- Name: "RegexDecodeValue",
- Types: []reflect.Type{tRegex},
- Received: reflect.Zero(t),
- }
- }
-
- var pattern, options string
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.Regex:
- pattern, options, err = vr.ReadRegex()
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a Regex", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(primitive.Regex{Pattern: pattern, Options: options}), nil
-}
-
-// RegexDecodeValue is the ValueDecoderFunc for Regex.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) RegexDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tRegex {
- return ValueDecoderError{Name: "RegexDecodeValue", Types: []reflect.Type{tRegex}, Received: val}
- }
-
- elem, err := dvd.regexDecodeType(dc, vr, tRegex)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (DefaultValueDecoders) dBPointerDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tDBPointer {
- return emptyValue, ValueDecoderError{
- Name: "DBPointerDecodeValue",
- Types: []reflect.Type{tDBPointer},
- Received: reflect.Zero(t),
- }
- }
-
- var ns string
- var pointer primitive.ObjectID
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.DBPointer:
- ns, pointer, err = vr.ReadDBPointer()
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a DBPointer", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(primitive.DBPointer{DB: ns, Pointer: pointer}), nil
-}
-
-// DBPointerDecodeValue is the ValueDecoderFunc for DBPointer.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) DBPointerDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tDBPointer {
- return ValueDecoderError{Name: "DBPointerDecodeValue", Types: []reflect.Type{tDBPointer}, Received: val}
- }
-
- elem, err := dvd.dBPointerDecodeType(dc, vr, tDBPointer)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (DefaultValueDecoders) timestampDecodeType(_ DecodeContext, vr bsonrw.ValueReader, reflectType reflect.Type) (reflect.Value, error) {
- if reflectType != tTimestamp {
- return emptyValue, ValueDecoderError{
- Name: "TimestampDecodeValue",
- Types: []reflect.Type{tTimestamp},
- Received: reflect.Zero(reflectType),
- }
- }
-
- var t, incr uint32
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.Timestamp:
- t, incr, err = vr.ReadTimestamp()
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a Timestamp", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(primitive.Timestamp{T: t, I: incr}), nil
-}
-
-// TimestampDecodeValue is the ValueDecoderFunc for Timestamp.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) TimestampDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tTimestamp {
- return ValueDecoderError{Name: "TimestampDecodeValue", Types: []reflect.Type{tTimestamp}, Received: val}
- }
-
- elem, err := dvd.timestampDecodeType(dc, vr, tTimestamp)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (DefaultValueDecoders) minKeyDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tMinKey {
- return emptyValue, ValueDecoderError{
- Name: "MinKeyDecodeValue",
- Types: []reflect.Type{tMinKey},
- Received: reflect.Zero(t),
- }
- }
-
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.MinKey:
- err = vr.ReadMinKey()
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a MinKey", vr.Type())
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(primitive.MinKey{}), nil
-}
-
-// MinKeyDecodeValue is the ValueDecoderFunc for MinKey.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) MinKeyDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tMinKey {
- return ValueDecoderError{Name: "MinKeyDecodeValue", Types: []reflect.Type{tMinKey}, Received: val}
- }
-
- elem, err := dvd.minKeyDecodeType(dc, vr, tMinKey)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (DefaultValueDecoders) maxKeyDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tMaxKey {
- return emptyValue, ValueDecoderError{
- Name: "MaxKeyDecodeValue",
- Types: []reflect.Type{tMaxKey},
- Received: reflect.Zero(t),
- }
- }
-
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.MaxKey:
- err = vr.ReadMaxKey()
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a MaxKey", vr.Type())
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(primitive.MaxKey{}), nil
-}
-
-// MaxKeyDecodeValue is the ValueDecoderFunc for MaxKey.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) MaxKeyDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tMaxKey {
- return ValueDecoderError{Name: "MaxKeyDecodeValue", Types: []reflect.Type{tMaxKey}, Received: val}
- }
-
- elem, err := dvd.maxKeyDecodeType(dc, vr, tMaxKey)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (dvd DefaultValueDecoders) decimal128DecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tDecimal {
- return emptyValue, ValueDecoderError{
- Name: "Decimal128DecodeValue",
- Types: []reflect.Type{tDecimal},
- Received: reflect.Zero(t),
- }
- }
-
- var d128 primitive.Decimal128
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.Decimal128:
- d128, err = vr.ReadDecimal128()
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a primitive.Decimal128", vr.Type())
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(d128), nil
-}
-
-// Decimal128DecodeValue is the ValueDecoderFunc for primitive.Decimal128.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) Decimal128DecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tDecimal {
- return ValueDecoderError{Name: "Decimal128DecodeValue", Types: []reflect.Type{tDecimal}, Received: val}
- }
-
- elem, err := dvd.decimal128DecodeType(dctx, vr, tDecimal)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (dvd DefaultValueDecoders) jsonNumberDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tJSONNumber {
- return emptyValue, ValueDecoderError{
- Name: "JSONNumberDecodeValue",
- Types: []reflect.Type{tJSONNumber},
- Received: reflect.Zero(t),
- }
- }
-
- var jsonNum json.Number
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.Double:
- f64, err := vr.ReadDouble()
- if err != nil {
- return emptyValue, err
- }
- jsonNum = json.Number(strconv.FormatFloat(f64, 'f', -1, 64))
- case bsontype.Int32:
- i32, err := vr.ReadInt32()
- if err != nil {
- return emptyValue, err
- }
- jsonNum = json.Number(strconv.FormatInt(int64(i32), 10))
- case bsontype.Int64:
- i64, err := vr.ReadInt64()
- if err != nil {
- return emptyValue, err
- }
- jsonNum = json.Number(strconv.FormatInt(i64, 10))
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a json.Number", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(jsonNum), nil
-}
-
-// JSONNumberDecodeValue is the ValueDecoderFunc for json.Number.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) JSONNumberDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tJSONNumber {
- return ValueDecoderError{Name: "JSONNumberDecodeValue", Types: []reflect.Type{tJSONNumber}, Received: val}
- }
-
- elem, err := dvd.jsonNumberDecodeType(dc, vr, tJSONNumber)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (dvd DefaultValueDecoders) urlDecodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tURL {
- return emptyValue, ValueDecoderError{
- Name: "URLDecodeValue",
- Types: []reflect.Type{tURL},
- Received: reflect.Zero(t),
- }
- }
-
- urlPtr := &url.URL{}
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.String:
- var str string // Declare str here to avoid shadowing err during the ReadString call.
- str, err = vr.ReadString()
- if err != nil {
- return emptyValue, err
- }
-
- urlPtr, err = url.Parse(str)
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a *url.URL", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(urlPtr).Elem(), nil
-}
-
-// URLDecodeValue is the ValueDecoderFunc for url.URL.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) URLDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tURL {
- return ValueDecoderError{Name: "URLDecodeValue", Types: []reflect.Type{tURL}, Received: val}
- }
-
- elem, err := dvd.urlDecodeType(dc, vr, tURL)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-// TimeDecodeValue is the ValueDecoderFunc for time.Time.
-//
-// Deprecated: TimeDecodeValue is not registered by default. Use TimeCodec.DecodeValue instead.
-func (dvd DefaultValueDecoders) TimeDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if vr.Type() != bsontype.DateTime {
- return fmt.Errorf("cannot decode %v into a time.Time", vr.Type())
- }
-
- dt, err := vr.ReadDateTime()
- if err != nil {
- return err
- }
-
- if !val.CanSet() || val.Type() != tTime {
- return ValueDecoderError{Name: "TimeDecodeValue", Types: []reflect.Type{tTime}, Received: val}
- }
-
- val.Set(reflect.ValueOf(time.Unix(dt/1000, dt%1000*1000000).UTC()))
- return nil
-}
-
-// ByteSliceDecodeValue is the ValueDecoderFunc for []byte.
-//
-// Deprecated: ByteSliceDecodeValue is not registered by default. Use ByteSliceCodec.DecodeValue instead.
-func (dvd DefaultValueDecoders) ByteSliceDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if vr.Type() != bsontype.Binary && vr.Type() != bsontype.Null {
- return fmt.Errorf("cannot decode %v into a []byte", vr.Type())
- }
-
- if !val.CanSet() || val.Type() != tByteSlice {
- return ValueDecoderError{Name: "ByteSliceDecodeValue", Types: []reflect.Type{tByteSlice}, Received: val}
- }
-
- if vr.Type() == bsontype.Null {
- val.Set(reflect.Zero(val.Type()))
- return vr.ReadNull()
- }
-
- data, subtype, err := vr.ReadBinary()
- if err != nil {
- return err
- }
- if subtype != 0x00 {
- return fmt.Errorf("ByteSliceDecodeValue can only be used to decode subtype 0x00 for %s, got %v", bsontype.Binary, subtype)
- }
-
- val.Set(reflect.ValueOf(data))
- return nil
-}
-
-// MapDecodeValue is the ValueDecoderFunc for map[string]* types.
-//
-// Deprecated: MapDecodeValue is not registered by default. Use MapCodec.DecodeValue instead.
-func (dvd DefaultValueDecoders) MapDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Kind() != reflect.Map || val.Type().Key().Kind() != reflect.String {
- return ValueDecoderError{Name: "MapDecodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val}
- }
-
- switch vr.Type() {
- case bsontype.Type(0), bsontype.EmbeddedDocument:
- case bsontype.Null:
- val.Set(reflect.Zero(val.Type()))
- return vr.ReadNull()
- default:
- return fmt.Errorf("cannot decode %v into a %s", vr.Type(), val.Type())
- }
-
- dr, err := vr.ReadDocument()
- if err != nil {
- return err
- }
-
- if val.IsNil() {
- val.Set(reflect.MakeMap(val.Type()))
- }
-
- eType := val.Type().Elem()
- decoder, err := dc.LookupDecoder(eType)
- if err != nil {
- return err
- }
-
- if eType == tEmpty {
- dc.Ancestor = val.Type()
- }
-
- keyType := val.Type().Key()
- for {
- key, vr, err := dr.ReadElement()
- if errors.Is(err, bsonrw.ErrEOD) {
- break
- }
- if err != nil {
- return err
- }
-
- elem := reflect.New(eType).Elem()
-
- err = decoder.DecodeValue(dc, vr, elem)
- if err != nil {
- return err
- }
-
- val.SetMapIndex(reflect.ValueOf(key).Convert(keyType), elem)
- }
- return nil
-}
-
-// ArrayDecodeValue is the ValueDecoderFunc for array types.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) ArrayDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.IsValid() || val.Kind() != reflect.Array {
- return ValueDecoderError{Name: "ArrayDecodeValue", Kinds: []reflect.Kind{reflect.Array}, Received: val}
- }
-
- switch vrType := vr.Type(); vrType {
- case bsontype.Array:
- case bsontype.Type(0), bsontype.EmbeddedDocument:
- if val.Type().Elem() != tE {
- return fmt.Errorf("cannot decode document into %s", val.Type())
- }
- case bsontype.Binary:
- if val.Type().Elem() != tByte {
- return fmt.Errorf("ArrayDecodeValue can only be used to decode binary into a byte array, got %v", vrType)
- }
- data, subtype, err := vr.ReadBinary()
- if err != nil {
- return err
- }
- if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld {
- return fmt.Errorf("ArrayDecodeValue can only be used to decode subtype 0x00 or 0x02 for %s, got %v", bsontype.Binary, subtype)
- }
-
- if len(data) > val.Len() {
- return fmt.Errorf("more elements returned in array than can fit inside %s", val.Type())
- }
-
- for idx, elem := range data {
- val.Index(idx).Set(reflect.ValueOf(elem))
- }
- return nil
- case bsontype.Null:
- val.Set(reflect.Zero(val.Type()))
- return vr.ReadNull()
- case bsontype.Undefined:
- val.Set(reflect.Zero(val.Type()))
- return vr.ReadUndefined()
- default:
- return fmt.Errorf("cannot decode %v into an array", vrType)
- }
-
- var elemsFunc func(DecodeContext, bsonrw.ValueReader, reflect.Value) ([]reflect.Value, error)
- switch val.Type().Elem() {
- case tE:
- elemsFunc = dvd.decodeD
- default:
- elemsFunc = dvd.decodeDefault
- }
-
- elems, err := elemsFunc(dc, vr, val)
- if err != nil {
- return err
- }
-
- if len(elems) > val.Len() {
- return fmt.Errorf("more elements returned in array than can fit inside %s, got %v elements", val.Type(), len(elems))
- }
-
- for idx, elem := range elems {
- val.Index(idx).Set(elem)
- }
-
- return nil
-}
-
-// SliceDecodeValue is the ValueDecoderFunc for slice types.
-//
-// Deprecated: SliceDecodeValue is not registered by default. Use SliceCodec.DecodeValue instead.
-func (dvd DefaultValueDecoders) SliceDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Kind() != reflect.Slice {
- return ValueDecoderError{Name: "SliceDecodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val}
- }
-
- switch vr.Type() {
- case bsontype.Array:
- case bsontype.Null:
- val.Set(reflect.Zero(val.Type()))
- return vr.ReadNull()
- case bsontype.Type(0), bsontype.EmbeddedDocument:
- if val.Type().Elem() != tE {
- return fmt.Errorf("cannot decode document into %s", val.Type())
- }
- default:
- return fmt.Errorf("cannot decode %v into a slice", vr.Type())
- }
-
- var elemsFunc func(DecodeContext, bsonrw.ValueReader, reflect.Value) ([]reflect.Value, error)
- switch val.Type().Elem() {
- case tE:
- dc.Ancestor = val.Type()
- elemsFunc = dvd.decodeD
- default:
- elemsFunc = dvd.decodeDefault
- }
-
- elems, err := elemsFunc(dc, vr, val)
- if err != nil {
- return err
- }
-
- if val.IsNil() {
- val.Set(reflect.MakeSlice(val.Type(), 0, len(elems)))
- }
-
- val.SetLen(0)
- val.Set(reflect.Append(val, elems...))
-
- return nil
-}
-
-// ValueUnmarshalerDecodeValue is the ValueDecoderFunc for ValueUnmarshaler implementations.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) ValueUnmarshalerDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.IsValid() || (!val.Type().Implements(tValueUnmarshaler) && !reflect.PtrTo(val.Type()).Implements(tValueUnmarshaler)) {
- return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val}
- }
-
- if val.Kind() == reflect.Ptr && val.IsNil() {
- if !val.CanSet() {
- return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val}
- }
- val.Set(reflect.New(val.Type().Elem()))
- }
-
- if !val.Type().Implements(tValueUnmarshaler) {
- if !val.CanAddr() {
- return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val}
- }
- val = val.Addr() // If the type doesn't implement the interface, a pointer to it must.
- }
-
- t, src, err := bsonrw.Copier{}.CopyValueToBytes(vr)
- if err != nil {
- return err
- }
-
- m, ok := val.Interface().(ValueUnmarshaler)
- if !ok {
- // NB: this error should be unreachable due to the above checks
- return ValueDecoderError{Name: "ValueUnmarshalerDecodeValue", Types: []reflect.Type{tValueUnmarshaler}, Received: val}
- }
- return m.UnmarshalBSONValue(t, src)
-}
-
-// UnmarshalerDecodeValue is the ValueDecoderFunc for Unmarshaler implementations.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) UnmarshalerDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.IsValid() || (!val.Type().Implements(tUnmarshaler) && !reflect.PtrTo(val.Type()).Implements(tUnmarshaler)) {
- return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val}
- }
-
- if val.Kind() == reflect.Ptr && val.IsNil() {
- if !val.CanSet() {
- return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val}
- }
- val.Set(reflect.New(val.Type().Elem()))
- }
-
- _, src, err := bsonrw.Copier{}.CopyValueToBytes(vr)
- if err != nil {
- return err
- }
-
- // If the target Go value is a pointer and the BSON field value is empty, set the value to the
- // zero value of the pointer (nil) and don't call UnmarshalBSON. UnmarshalBSON has no way to
- // change the pointer value from within the function (only the value at the pointer address),
- // so it can't set the pointer to "nil" itself. Since the most common Go value for an empty BSON
- // field value is "nil", we set "nil" here and don't call UnmarshalBSON. This behavior matches
- // the behavior of the Go "encoding/json" unmarshaler when the target Go value is a pointer and
- // the JSON field value is "null".
- if val.Kind() == reflect.Ptr && len(src) == 0 {
- val.Set(reflect.Zero(val.Type()))
- return nil
- }
-
- if !val.Type().Implements(tUnmarshaler) {
- if !val.CanAddr() {
- return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val}
- }
- val = val.Addr() // If the type doesn't implement the interface, a pointer to it must.
- }
-
- m, ok := val.Interface().(Unmarshaler)
- if !ok {
- // NB: this error should be unreachable due to the above checks
- return ValueDecoderError{Name: "UnmarshalerDecodeValue", Types: []reflect.Type{tUnmarshaler}, Received: val}
- }
- return m.UnmarshalBSON(src)
-}
-
-// EmptyInterfaceDecodeValue is the ValueDecoderFunc for interface{}.
-//
-// Deprecated: EmptyInterfaceDecodeValue is not registered by default. Use EmptyInterfaceCodec.DecodeValue instead.
-func (dvd DefaultValueDecoders) EmptyInterfaceDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tEmpty {
- return ValueDecoderError{Name: "EmptyInterfaceDecodeValue", Types: []reflect.Type{tEmpty}, Received: val}
- }
-
- rtype, err := dc.LookupTypeMapEntry(vr.Type())
- if err != nil {
- switch vr.Type() {
- case bsontype.EmbeddedDocument:
- if dc.Ancestor != nil {
- rtype = dc.Ancestor
- break
- }
- rtype = tD
- case bsontype.Null:
- val.Set(reflect.Zero(val.Type()))
- return vr.ReadNull()
- default:
- return err
- }
- }
-
- decoder, err := dc.LookupDecoder(rtype)
- if err != nil {
- return err
- }
-
- elem := reflect.New(rtype).Elem()
- err = decoder.DecodeValue(dc, vr, elem)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-// CoreDocumentDecodeValue is the ValueDecoderFunc for bsoncore.Document.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (DefaultValueDecoders) CoreDocumentDecodeValue(_ DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tCoreDocument {
- return ValueDecoderError{Name: "CoreDocumentDecodeValue", Types: []reflect.Type{tCoreDocument}, Received: val}
- }
-
- if val.IsNil() {
- val.Set(reflect.MakeSlice(val.Type(), 0, 0))
- }
-
- val.SetLen(0)
-
- cdoc, err := bsonrw.Copier{}.AppendDocumentBytes(val.Interface().(bsoncore.Document), vr)
- val.Set(reflect.ValueOf(cdoc))
- return err
-}
-
-func (dvd DefaultValueDecoders) decodeDefault(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) ([]reflect.Value, error) {
- elems := make([]reflect.Value, 0)
-
- ar, err := vr.ReadArray()
- if err != nil {
- return nil, err
- }
-
- eType := val.Type().Elem()
-
- decoder, err := dc.LookupDecoder(eType)
- if err != nil {
- return nil, err
- }
- eTypeDecoder, _ := decoder.(typeDecoder)
-
- idx := 0
- for {
- vr, err := ar.ReadValue()
- if errors.Is(err, bsonrw.ErrEOA) {
- break
- }
- if err != nil {
- return nil, err
- }
-
- elem, err := decodeTypeOrValueWithInfo(decoder, eTypeDecoder, dc, vr, eType, true)
- if err != nil {
- return nil, newDecodeError(strconv.Itoa(idx), err)
- }
- elems = append(elems, elem)
- idx++
- }
-
- return elems, nil
-}
-
-func (dvd DefaultValueDecoders) readCodeWithScope(dc DecodeContext, vr bsonrw.ValueReader) (primitive.CodeWithScope, error) {
- var cws primitive.CodeWithScope
-
- code, dr, err := vr.ReadCodeWithScope()
- if err != nil {
- return cws, err
- }
-
- scope := reflect.New(tD).Elem()
- elems, err := dvd.decodeElemsFromDocumentReader(dc, dr)
- if err != nil {
- return cws, err
- }
-
- scope.Set(reflect.MakeSlice(tD, 0, len(elems)))
- scope.Set(reflect.Append(scope, elems...))
-
- cws = primitive.CodeWithScope{
- Code: primitive.JavaScript(code),
- Scope: scope.Interface().(primitive.D),
- }
- return cws, nil
-}
-
-func (dvd DefaultValueDecoders) codeWithScopeDecodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tCodeWithScope {
- return emptyValue, ValueDecoderError{
- Name: "CodeWithScopeDecodeValue",
- Types: []reflect.Type{tCodeWithScope},
- Received: reflect.Zero(t),
- }
- }
-
- var cws primitive.CodeWithScope
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.CodeWithScope:
- cws, err = dvd.readCodeWithScope(dc, vr)
- case bsontype.Null:
- err = vr.ReadNull()
- case bsontype.Undefined:
- err = vr.ReadUndefined()
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a primitive.CodeWithScope", vrType)
- }
- if err != nil {
- return emptyValue, err
- }
-
- return reflect.ValueOf(cws), nil
-}
-
-// CodeWithScopeDecodeValue is the ValueDecoderFunc for CodeWithScope.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value decoders registered.
-func (dvd DefaultValueDecoders) CodeWithScopeDecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tCodeWithScope {
- return ValueDecoderError{Name: "CodeWithScopeDecodeValue", Types: []reflect.Type{tCodeWithScope}, Received: val}
- }
-
- elem, err := dvd.codeWithScopeDecodeType(dc, vr, tCodeWithScope)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-func (dvd DefaultValueDecoders) decodeD(dc DecodeContext, vr bsonrw.ValueReader, _ reflect.Value) ([]reflect.Value, error) {
- switch vr.Type() {
- case bsontype.Type(0), bsontype.EmbeddedDocument:
- default:
- return nil, fmt.Errorf("cannot decode %v into a D", vr.Type())
- }
-
- dr, err := vr.ReadDocument()
- if err != nil {
- return nil, err
- }
-
- return dvd.decodeElemsFromDocumentReader(dc, dr)
-}
-
-func (DefaultValueDecoders) decodeElemsFromDocumentReader(dc DecodeContext, dr bsonrw.DocumentReader) ([]reflect.Value, error) {
- decoder, err := dc.LookupDecoder(tEmpty)
- if err != nil {
- return nil, err
- }
-
- elems := make([]reflect.Value, 0)
- for {
- key, vr, err := dr.ReadElement()
- if errors.Is(err, bsonrw.ErrEOD) {
- break
- }
- if err != nil {
- return nil, err
- }
-
- val := reflect.New(tEmpty).Elem()
- err = decoder.DecodeValue(dc, vr, val)
- if err != nil {
- return nil, newDecodeError(key, err)
- }
-
- elems = append(elems, reflect.ValueOf(primitive.E{Key: key, Value: val.Interface()}))
- }
-
- return elems, nil
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go
deleted file mode 100644
index 4751ae995..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/default_value_encoders.go
+++ /dev/null
@@ -1,856 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "encoding/json"
- "errors"
- "fmt"
- "math"
- "net/url"
- "reflect"
- "sync"
- "time"
-
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
- "go.mongodb.org/mongo-driver/bson/primitive"
- "go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
-)
-
-var defaultValueEncoders DefaultValueEncoders
-
-var bvwPool = bsonrw.NewBSONValueWriterPool()
-
-var errInvalidValue = errors.New("cannot encode invalid element")
-
-var sliceWriterPool = sync.Pool{
- New: func() interface{} {
- sw := make(bsonrw.SliceWriter, 0)
- return &sw
- },
-}
-
-func encodeElement(ec EncodeContext, dw bsonrw.DocumentWriter, e primitive.E) error {
- vw, err := dw.WriteDocumentElement(e.Key)
- if err != nil {
- return err
- }
-
- if e.Value == nil {
- return vw.WriteNull()
- }
- encoder, err := ec.LookupEncoder(reflect.TypeOf(e.Value))
- if err != nil {
- return err
- }
-
- err = encoder.EncodeValue(ec, vw, reflect.ValueOf(e.Value))
- if err != nil {
- return err
- }
- return nil
-}
-
-// DefaultValueEncoders is a namespace type for the default ValueEncoders used
-// when creating a registry.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-type DefaultValueEncoders struct{}
-
-// RegisterDefaultEncoders will register the encoder methods attached to DefaultValueEncoders with
-// the provided RegistryBuilder.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) RegisterDefaultEncoders(rb *RegistryBuilder) {
- if rb == nil {
- panic(errors.New("argument to RegisterDefaultEncoders must not be nil"))
- }
- rb.
- RegisterTypeEncoder(tByteSlice, defaultByteSliceCodec).
- RegisterTypeEncoder(tTime, defaultTimeCodec).
- RegisterTypeEncoder(tEmpty, defaultEmptyInterfaceCodec).
- RegisterTypeEncoder(tCoreArray, defaultArrayCodec).
- RegisterTypeEncoder(tOID, ValueEncoderFunc(dve.ObjectIDEncodeValue)).
- RegisterTypeEncoder(tDecimal, ValueEncoderFunc(dve.Decimal128EncodeValue)).
- RegisterTypeEncoder(tJSONNumber, ValueEncoderFunc(dve.JSONNumberEncodeValue)).
- RegisterTypeEncoder(tURL, ValueEncoderFunc(dve.URLEncodeValue)).
- RegisterTypeEncoder(tJavaScript, ValueEncoderFunc(dve.JavaScriptEncodeValue)).
- RegisterTypeEncoder(tSymbol, ValueEncoderFunc(dve.SymbolEncodeValue)).
- RegisterTypeEncoder(tBinary, ValueEncoderFunc(dve.BinaryEncodeValue)).
- RegisterTypeEncoder(tUndefined, ValueEncoderFunc(dve.UndefinedEncodeValue)).
- RegisterTypeEncoder(tDateTime, ValueEncoderFunc(dve.DateTimeEncodeValue)).
- RegisterTypeEncoder(tNull, ValueEncoderFunc(dve.NullEncodeValue)).
- RegisterTypeEncoder(tRegex, ValueEncoderFunc(dve.RegexEncodeValue)).
- RegisterTypeEncoder(tDBPointer, ValueEncoderFunc(dve.DBPointerEncodeValue)).
- RegisterTypeEncoder(tTimestamp, ValueEncoderFunc(dve.TimestampEncodeValue)).
- RegisterTypeEncoder(tMinKey, ValueEncoderFunc(dve.MinKeyEncodeValue)).
- RegisterTypeEncoder(tMaxKey, ValueEncoderFunc(dve.MaxKeyEncodeValue)).
- RegisterTypeEncoder(tCoreDocument, ValueEncoderFunc(dve.CoreDocumentEncodeValue)).
- RegisterTypeEncoder(tCodeWithScope, ValueEncoderFunc(dve.CodeWithScopeEncodeValue)).
- RegisterDefaultEncoder(reflect.Bool, ValueEncoderFunc(dve.BooleanEncodeValue)).
- RegisterDefaultEncoder(reflect.Int, ValueEncoderFunc(dve.IntEncodeValue)).
- RegisterDefaultEncoder(reflect.Int8, ValueEncoderFunc(dve.IntEncodeValue)).
- RegisterDefaultEncoder(reflect.Int16, ValueEncoderFunc(dve.IntEncodeValue)).
- RegisterDefaultEncoder(reflect.Int32, ValueEncoderFunc(dve.IntEncodeValue)).
- RegisterDefaultEncoder(reflect.Int64, ValueEncoderFunc(dve.IntEncodeValue)).
- RegisterDefaultEncoder(reflect.Uint, defaultUIntCodec).
- RegisterDefaultEncoder(reflect.Uint8, defaultUIntCodec).
- RegisterDefaultEncoder(reflect.Uint16, defaultUIntCodec).
- RegisterDefaultEncoder(reflect.Uint32, defaultUIntCodec).
- RegisterDefaultEncoder(reflect.Uint64, defaultUIntCodec).
- RegisterDefaultEncoder(reflect.Float32, ValueEncoderFunc(dve.FloatEncodeValue)).
- RegisterDefaultEncoder(reflect.Float64, ValueEncoderFunc(dve.FloatEncodeValue)).
- RegisterDefaultEncoder(reflect.Array, ValueEncoderFunc(dve.ArrayEncodeValue)).
- RegisterDefaultEncoder(reflect.Map, defaultMapCodec).
- RegisterDefaultEncoder(reflect.Slice, defaultSliceCodec).
- RegisterDefaultEncoder(reflect.String, defaultStringCodec).
- RegisterDefaultEncoder(reflect.Struct, newDefaultStructCodec()).
- RegisterDefaultEncoder(reflect.Ptr, NewPointerCodec()).
- RegisterHookEncoder(tValueMarshaler, ValueEncoderFunc(dve.ValueMarshalerEncodeValue)).
- RegisterHookEncoder(tMarshaler, ValueEncoderFunc(dve.MarshalerEncodeValue)).
- RegisterHookEncoder(tProxy, ValueEncoderFunc(dve.ProxyEncodeValue))
-}
-
-// BooleanEncodeValue is the ValueEncoderFunc for bool types.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) BooleanEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Kind() != reflect.Bool {
- return ValueEncoderError{Name: "BooleanEncodeValue", Kinds: []reflect.Kind{reflect.Bool}, Received: val}
- }
- return vw.WriteBoolean(val.Bool())
-}
-
-func fitsIn32Bits(i int64) bool {
- return math.MinInt32 <= i && i <= math.MaxInt32
-}
-
-// IntEncodeValue is the ValueEncoderFunc for int types.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) IntEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- switch val.Kind() {
- case reflect.Int8, reflect.Int16, reflect.Int32:
- return vw.WriteInt32(int32(val.Int()))
- case reflect.Int:
- i64 := val.Int()
- if fitsIn32Bits(i64) {
- return vw.WriteInt32(int32(i64))
- }
- return vw.WriteInt64(i64)
- case reflect.Int64:
- i64 := val.Int()
- if ec.MinSize && fitsIn32Bits(i64) {
- return vw.WriteInt32(int32(i64))
- }
- return vw.WriteInt64(i64)
- }
-
- return ValueEncoderError{
- Name: "IntEncodeValue",
- Kinds: []reflect.Kind{reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int},
- Received: val,
- }
-}
-
-// UintEncodeValue is the ValueEncoderFunc for uint types.
-//
-// Deprecated: UintEncodeValue is not registered by default. Use UintCodec.EncodeValue instead.
-func (dve DefaultValueEncoders) UintEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- switch val.Kind() {
- case reflect.Uint8, reflect.Uint16:
- return vw.WriteInt32(int32(val.Uint()))
- case reflect.Uint, reflect.Uint32, reflect.Uint64:
- u64 := val.Uint()
- if ec.MinSize && u64 <= math.MaxInt32 {
- return vw.WriteInt32(int32(u64))
- }
- if u64 > math.MaxInt64 {
- return fmt.Errorf("%d overflows int64", u64)
- }
- return vw.WriteInt64(int64(u64))
- }
-
- return ValueEncoderError{
- Name: "UintEncodeValue",
- Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint},
- Received: val,
- }
-}
-
-// FloatEncodeValue is the ValueEncoderFunc for float types.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) FloatEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- switch val.Kind() {
- case reflect.Float32, reflect.Float64:
- return vw.WriteDouble(val.Float())
- }
-
- return ValueEncoderError{Name: "FloatEncodeValue", Kinds: []reflect.Kind{reflect.Float32, reflect.Float64}, Received: val}
-}
-
-// StringEncodeValue is the ValueEncoderFunc for string types.
-//
-// Deprecated: StringEncodeValue is not registered by default. Use StringCodec.EncodeValue instead.
-func (dve DefaultValueEncoders) StringEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if val.Kind() != reflect.String {
- return ValueEncoderError{
- Name: "StringEncodeValue",
- Kinds: []reflect.Kind{reflect.String},
- Received: val,
- }
- }
-
- return vw.WriteString(val.String())
-}
-
-// ObjectIDEncodeValue is the ValueEncoderFunc for primitive.ObjectID.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) ObjectIDEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tOID {
- return ValueEncoderError{Name: "ObjectIDEncodeValue", Types: []reflect.Type{tOID}, Received: val}
- }
- return vw.WriteObjectID(val.Interface().(primitive.ObjectID))
-}
-
-// Decimal128EncodeValue is the ValueEncoderFunc for primitive.Decimal128.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) Decimal128EncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tDecimal {
- return ValueEncoderError{Name: "Decimal128EncodeValue", Types: []reflect.Type{tDecimal}, Received: val}
- }
- return vw.WriteDecimal128(val.Interface().(primitive.Decimal128))
-}
-
-// JSONNumberEncodeValue is the ValueEncoderFunc for json.Number.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) JSONNumberEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tJSONNumber {
- return ValueEncoderError{Name: "JSONNumberEncodeValue", Types: []reflect.Type{tJSONNumber}, Received: val}
- }
- jsnum := val.Interface().(json.Number)
-
- // Attempt int first, then float64
- if i64, err := jsnum.Int64(); err == nil {
- return dve.IntEncodeValue(ec, vw, reflect.ValueOf(i64))
- }
-
- f64, err := jsnum.Float64()
- if err != nil {
- return err
- }
-
- return dve.FloatEncodeValue(ec, vw, reflect.ValueOf(f64))
-}
-
-// URLEncodeValue is the ValueEncoderFunc for url.URL.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) URLEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tURL {
- return ValueEncoderError{Name: "URLEncodeValue", Types: []reflect.Type{tURL}, Received: val}
- }
- u := val.Interface().(url.URL)
- return vw.WriteString(u.String())
-}
-
-// TimeEncodeValue is the ValueEncoderFunc for time.TIme.
-//
-// Deprecated: TimeEncodeValue is not registered by default. Use TimeCodec.EncodeValue instead.
-func (dve DefaultValueEncoders) TimeEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tTime {
- return ValueEncoderError{Name: "TimeEncodeValue", Types: []reflect.Type{tTime}, Received: val}
- }
- tt := val.Interface().(time.Time)
- dt := primitive.NewDateTimeFromTime(tt)
- return vw.WriteDateTime(int64(dt))
-}
-
-// ByteSliceEncodeValue is the ValueEncoderFunc for []byte.
-//
-// Deprecated: ByteSliceEncodeValue is not registered by default. Use ByteSliceCodec.EncodeValue instead.
-func (dve DefaultValueEncoders) ByteSliceEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tByteSlice {
- return ValueEncoderError{Name: "ByteSliceEncodeValue", Types: []reflect.Type{tByteSlice}, Received: val}
- }
- if val.IsNil() {
- return vw.WriteNull()
- }
- return vw.WriteBinary(val.Interface().([]byte))
-}
-
-// MapEncodeValue is the ValueEncoderFunc for map[string]* types.
-//
-// Deprecated: MapEncodeValue is not registered by default. Use MapCodec.EncodeValue instead.
-func (dve DefaultValueEncoders) MapEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Kind() != reflect.Map || val.Type().Key().Kind() != reflect.String {
- return ValueEncoderError{Name: "MapEncodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val}
- }
-
- if val.IsNil() {
- // If we have a nill map but we can't WriteNull, that means we're probably trying to encode
- // to a TopLevel document. We can't currently tell if this is what actually happened, but if
- // there's a deeper underlying problem, the error will also be returned from WriteDocument,
- // so just continue. The operations on a map reflection value are valid, so we can call
- // MapKeys within mapEncodeValue without a problem.
- err := vw.WriteNull()
- if err == nil {
- return nil
- }
- }
-
- dw, err := vw.WriteDocument()
- if err != nil {
- return err
- }
-
- return dve.mapEncodeValue(ec, dw, val, nil)
-}
-
-// mapEncodeValue handles encoding of the values of a map. The collisionFn returns
-// true if the provided key exists, this is mainly used for inline maps in the
-// struct codec.
-func (dve DefaultValueEncoders) mapEncodeValue(ec EncodeContext, dw bsonrw.DocumentWriter, val reflect.Value, collisionFn func(string) bool) error {
-
- elemType := val.Type().Elem()
- encoder, err := ec.LookupEncoder(elemType)
- if err != nil && elemType.Kind() != reflect.Interface {
- return err
- }
-
- keys := val.MapKeys()
- for _, key := range keys {
- if collisionFn != nil && collisionFn(key.String()) {
- return fmt.Errorf("Key %s of inlined map conflicts with a struct field name", key)
- }
-
- currEncoder, currVal, lookupErr := dve.lookupElementEncoder(ec, encoder, val.MapIndex(key))
- if lookupErr != nil && !errors.Is(lookupErr, errInvalidValue) {
- return lookupErr
- }
-
- vw, err := dw.WriteDocumentElement(key.String())
- if err != nil {
- return err
- }
-
- if errors.Is(lookupErr, errInvalidValue) {
- err = vw.WriteNull()
- if err != nil {
- return err
- }
- continue
- }
-
- err = currEncoder.EncodeValue(ec, vw, currVal)
- if err != nil {
- return err
- }
- }
-
- return dw.WriteDocumentEnd()
-}
-
-// ArrayEncodeValue is the ValueEncoderFunc for array types.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) ArrayEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Kind() != reflect.Array {
- return ValueEncoderError{Name: "ArrayEncodeValue", Kinds: []reflect.Kind{reflect.Array}, Received: val}
- }
-
- // If we have a []primitive.E we want to treat it as a document instead of as an array.
- if val.Type().Elem() == tE {
- dw, err := vw.WriteDocument()
- if err != nil {
- return err
- }
-
- for idx := 0; idx < val.Len(); idx++ {
- e := val.Index(idx).Interface().(primitive.E)
- err = encodeElement(ec, dw, e)
- if err != nil {
- return err
- }
- }
-
- return dw.WriteDocumentEnd()
- }
-
- // If we have a []byte we want to treat it as a binary instead of as an array.
- if val.Type().Elem() == tByte {
- var byteSlice []byte
- for idx := 0; idx < val.Len(); idx++ {
- byteSlice = append(byteSlice, val.Index(idx).Interface().(byte))
- }
- return vw.WriteBinary(byteSlice)
- }
-
- aw, err := vw.WriteArray()
- if err != nil {
- return err
- }
-
- elemType := val.Type().Elem()
- encoder, err := ec.LookupEncoder(elemType)
- if err != nil && elemType.Kind() != reflect.Interface {
- return err
- }
-
- for idx := 0; idx < val.Len(); idx++ {
- currEncoder, currVal, lookupErr := dve.lookupElementEncoder(ec, encoder, val.Index(idx))
- if lookupErr != nil && !errors.Is(lookupErr, errInvalidValue) {
- return lookupErr
- }
-
- vw, err := aw.WriteArrayElement()
- if err != nil {
- return err
- }
-
- if errors.Is(lookupErr, errInvalidValue) {
- err = vw.WriteNull()
- if err != nil {
- return err
- }
- continue
- }
-
- err = currEncoder.EncodeValue(ec, vw, currVal)
- if err != nil {
- return err
- }
- }
- return aw.WriteArrayEnd()
-}
-
-// SliceEncodeValue is the ValueEncoderFunc for slice types.
-//
-// Deprecated: SliceEncodeValue is not registered by default. Use SliceCodec.EncodeValue instead.
-func (dve DefaultValueEncoders) SliceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Kind() != reflect.Slice {
- return ValueEncoderError{Name: "SliceEncodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val}
- }
-
- if val.IsNil() {
- return vw.WriteNull()
- }
-
- // If we have a []primitive.E we want to treat it as a document instead of as an array.
- if val.Type().ConvertibleTo(tD) {
- d := val.Convert(tD).Interface().(primitive.D)
-
- dw, err := vw.WriteDocument()
- if err != nil {
- return err
- }
-
- for _, e := range d {
- err = encodeElement(ec, dw, e)
- if err != nil {
- return err
- }
- }
-
- return dw.WriteDocumentEnd()
- }
-
- aw, err := vw.WriteArray()
- if err != nil {
- return err
- }
-
- elemType := val.Type().Elem()
- encoder, err := ec.LookupEncoder(elemType)
- if err != nil && elemType.Kind() != reflect.Interface {
- return err
- }
-
- for idx := 0; idx < val.Len(); idx++ {
- currEncoder, currVal, lookupErr := dve.lookupElementEncoder(ec, encoder, val.Index(idx))
- if lookupErr != nil && !errors.Is(lookupErr, errInvalidValue) {
- return lookupErr
- }
-
- vw, err := aw.WriteArrayElement()
- if err != nil {
- return err
- }
-
- if errors.Is(lookupErr, errInvalidValue) {
- err = vw.WriteNull()
- if err != nil {
- return err
- }
- continue
- }
-
- err = currEncoder.EncodeValue(ec, vw, currVal)
- if err != nil {
- return err
- }
- }
- return aw.WriteArrayEnd()
-}
-
-func (dve DefaultValueEncoders) lookupElementEncoder(ec EncodeContext, origEncoder ValueEncoder, currVal reflect.Value) (ValueEncoder, reflect.Value, error) {
- if origEncoder != nil || (currVal.Kind() != reflect.Interface) {
- return origEncoder, currVal, nil
- }
- currVal = currVal.Elem()
- if !currVal.IsValid() {
- return nil, currVal, errInvalidValue
- }
- currEncoder, err := ec.LookupEncoder(currVal.Type())
-
- return currEncoder, currVal, err
-}
-
-// EmptyInterfaceEncodeValue is the ValueEncoderFunc for interface{}.
-//
-// Deprecated: EmptyInterfaceEncodeValue is not registered by default. Use EmptyInterfaceCodec.EncodeValue instead.
-func (dve DefaultValueEncoders) EmptyInterfaceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tEmpty {
- return ValueEncoderError{Name: "EmptyInterfaceEncodeValue", Types: []reflect.Type{tEmpty}, Received: val}
- }
-
- if val.IsNil() {
- return vw.WriteNull()
- }
- encoder, err := ec.LookupEncoder(val.Elem().Type())
- if err != nil {
- return err
- }
-
- return encoder.EncodeValue(ec, vw, val.Elem())
-}
-
-// ValueMarshalerEncodeValue is the ValueEncoderFunc for ValueMarshaler implementations.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) ValueMarshalerEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- // Either val or a pointer to val must implement ValueMarshaler
- switch {
- case !val.IsValid():
- return ValueEncoderError{Name: "ValueMarshalerEncodeValue", Types: []reflect.Type{tValueMarshaler}, Received: val}
- case val.Type().Implements(tValueMarshaler):
- // If ValueMarshaler is implemented on a concrete type, make sure that val isn't a nil pointer
- if isImplementationNil(val, tValueMarshaler) {
- return vw.WriteNull()
- }
- case reflect.PtrTo(val.Type()).Implements(tValueMarshaler) && val.CanAddr():
- val = val.Addr()
- default:
- return ValueEncoderError{Name: "ValueMarshalerEncodeValue", Types: []reflect.Type{tValueMarshaler}, Received: val}
- }
-
- m, ok := val.Interface().(ValueMarshaler)
- if !ok {
- return vw.WriteNull()
- }
- t, data, err := m.MarshalBSONValue()
- if err != nil {
- return err
- }
- return bsonrw.Copier{}.CopyValueFromBytes(vw, t, data)
-}
-
-// MarshalerEncodeValue is the ValueEncoderFunc for Marshaler implementations.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) MarshalerEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- // Either val or a pointer to val must implement Marshaler
- switch {
- case !val.IsValid():
- return ValueEncoderError{Name: "MarshalerEncodeValue", Types: []reflect.Type{tMarshaler}, Received: val}
- case val.Type().Implements(tMarshaler):
- // If Marshaler is implemented on a concrete type, make sure that val isn't a nil pointer
- if isImplementationNil(val, tMarshaler) {
- return vw.WriteNull()
- }
- case reflect.PtrTo(val.Type()).Implements(tMarshaler) && val.CanAddr():
- val = val.Addr()
- default:
- return ValueEncoderError{Name: "MarshalerEncodeValue", Types: []reflect.Type{tMarshaler}, Received: val}
- }
-
- m, ok := val.Interface().(Marshaler)
- if !ok {
- return vw.WriteNull()
- }
- data, err := m.MarshalBSON()
- if err != nil {
- return err
- }
- return bsonrw.Copier{}.CopyValueFromBytes(vw, bsontype.EmbeddedDocument, data)
-}
-
-// ProxyEncodeValue is the ValueEncoderFunc for Proxy implementations.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) ProxyEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- // Either val or a pointer to val must implement Proxy
- switch {
- case !val.IsValid():
- return ValueEncoderError{Name: "ProxyEncodeValue", Types: []reflect.Type{tProxy}, Received: val}
- case val.Type().Implements(tProxy):
- // If Proxy is implemented on a concrete type, make sure that val isn't a nil pointer
- if isImplementationNil(val, tProxy) {
- return vw.WriteNull()
- }
- case reflect.PtrTo(val.Type()).Implements(tProxy) && val.CanAddr():
- val = val.Addr()
- default:
- return ValueEncoderError{Name: "ProxyEncodeValue", Types: []reflect.Type{tProxy}, Received: val}
- }
-
- m, ok := val.Interface().(Proxy)
- if !ok {
- return vw.WriteNull()
- }
- v, err := m.ProxyBSON()
- if err != nil {
- return err
- }
- if v == nil {
- encoder, err := ec.LookupEncoder(nil)
- if err != nil {
- return err
- }
- return encoder.EncodeValue(ec, vw, reflect.ValueOf(nil))
- }
- vv := reflect.ValueOf(v)
- switch vv.Kind() {
- case reflect.Ptr, reflect.Interface:
- vv = vv.Elem()
- }
- encoder, err := ec.LookupEncoder(vv.Type())
- if err != nil {
- return err
- }
- return encoder.EncodeValue(ec, vw, vv)
-}
-
-// JavaScriptEncodeValue is the ValueEncoderFunc for the primitive.JavaScript type.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) JavaScriptEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tJavaScript {
- return ValueEncoderError{Name: "JavaScriptEncodeValue", Types: []reflect.Type{tJavaScript}, Received: val}
- }
-
- return vw.WriteJavascript(val.String())
-}
-
-// SymbolEncodeValue is the ValueEncoderFunc for the primitive.Symbol type.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) SymbolEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tSymbol {
- return ValueEncoderError{Name: "SymbolEncodeValue", Types: []reflect.Type{tSymbol}, Received: val}
- }
-
- return vw.WriteSymbol(val.String())
-}
-
-// BinaryEncodeValue is the ValueEncoderFunc for Binary.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) BinaryEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tBinary {
- return ValueEncoderError{Name: "BinaryEncodeValue", Types: []reflect.Type{tBinary}, Received: val}
- }
- b := val.Interface().(primitive.Binary)
-
- return vw.WriteBinaryWithSubtype(b.Data, b.Subtype)
-}
-
-// UndefinedEncodeValue is the ValueEncoderFunc for Undefined.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) UndefinedEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tUndefined {
- return ValueEncoderError{Name: "UndefinedEncodeValue", Types: []reflect.Type{tUndefined}, Received: val}
- }
-
- return vw.WriteUndefined()
-}
-
-// DateTimeEncodeValue is the ValueEncoderFunc for DateTime.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) DateTimeEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tDateTime {
- return ValueEncoderError{Name: "DateTimeEncodeValue", Types: []reflect.Type{tDateTime}, Received: val}
- }
-
- return vw.WriteDateTime(val.Int())
-}
-
-// NullEncodeValue is the ValueEncoderFunc for Null.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) NullEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tNull {
- return ValueEncoderError{Name: "NullEncodeValue", Types: []reflect.Type{tNull}, Received: val}
- }
-
- return vw.WriteNull()
-}
-
-// RegexEncodeValue is the ValueEncoderFunc for Regex.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) RegexEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tRegex {
- return ValueEncoderError{Name: "RegexEncodeValue", Types: []reflect.Type{tRegex}, Received: val}
- }
-
- regex := val.Interface().(primitive.Regex)
-
- return vw.WriteRegex(regex.Pattern, regex.Options)
-}
-
-// DBPointerEncodeValue is the ValueEncoderFunc for DBPointer.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) DBPointerEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tDBPointer {
- return ValueEncoderError{Name: "DBPointerEncodeValue", Types: []reflect.Type{tDBPointer}, Received: val}
- }
-
- dbp := val.Interface().(primitive.DBPointer)
-
- return vw.WriteDBPointer(dbp.DB, dbp.Pointer)
-}
-
-// TimestampEncodeValue is the ValueEncoderFunc for Timestamp.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) TimestampEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tTimestamp {
- return ValueEncoderError{Name: "TimestampEncodeValue", Types: []reflect.Type{tTimestamp}, Received: val}
- }
-
- ts := val.Interface().(primitive.Timestamp)
-
- return vw.WriteTimestamp(ts.T, ts.I)
-}
-
-// MinKeyEncodeValue is the ValueEncoderFunc for MinKey.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) MinKeyEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tMinKey {
- return ValueEncoderError{Name: "MinKeyEncodeValue", Types: []reflect.Type{tMinKey}, Received: val}
- }
-
- return vw.WriteMinKey()
-}
-
-// MaxKeyEncodeValue is the ValueEncoderFunc for MaxKey.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) MaxKeyEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tMaxKey {
- return ValueEncoderError{Name: "MaxKeyEncodeValue", Types: []reflect.Type{tMaxKey}, Received: val}
- }
-
- return vw.WriteMaxKey()
-}
-
-// CoreDocumentEncodeValue is the ValueEncoderFunc for bsoncore.Document.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (DefaultValueEncoders) CoreDocumentEncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tCoreDocument {
- return ValueEncoderError{Name: "CoreDocumentEncodeValue", Types: []reflect.Type{tCoreDocument}, Received: val}
- }
-
- cdoc := val.Interface().(bsoncore.Document)
-
- return bsonrw.Copier{}.CopyDocumentFromBytes(vw, cdoc)
-}
-
-// CodeWithScopeEncodeValue is the ValueEncoderFunc for CodeWithScope.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.NewRegistry] to get a registry with all default
-// value encoders registered.
-func (dve DefaultValueEncoders) CodeWithScopeEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tCodeWithScope {
- return ValueEncoderError{Name: "CodeWithScopeEncodeValue", Types: []reflect.Type{tCodeWithScope}, Received: val}
- }
-
- cws := val.Interface().(primitive.CodeWithScope)
-
- dw, err := vw.WriteCodeWithScope(string(cws.Code))
- if err != nil {
- return err
- }
-
- sw := sliceWriterPool.Get().(*bsonrw.SliceWriter)
- defer sliceWriterPool.Put(sw)
- *sw = (*sw)[:0]
-
- scopeVW := bvwPool.Get(sw)
- defer bvwPool.Put(scopeVW)
-
- encoder, err := ec.LookupEncoder(reflect.TypeOf(cws.Scope))
- if err != nil {
- return err
- }
-
- err = encoder.EncodeValue(ec, scopeVW, reflect.ValueOf(cws.Scope))
- if err != nil {
- return err
- }
-
- err = bsonrw.Copier{}.CopyBytesToDocumentWriter(dw, *sw)
- if err != nil {
- return err
- }
- return dw.WriteDocumentEnd()
-}
-
-// isImplementationNil returns if val is a nil pointer and inter is implemented on a concrete type
-func isImplementationNil(val reflect.Value, inter reflect.Type) bool {
- vt := val.Type()
- for vt.Kind() == reflect.Ptr {
- vt = vt.Elem()
- }
- return vt.Implements(inter) && val.Kind() == reflect.Ptr && val.IsNil()
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go
deleted file mode 100644
index 4613e5a1e..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/doc.go
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2022-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-// Package bsoncodec provides a system for encoding values to BSON representations and decoding
-// values from BSON representations. This package considers both binary BSON and ExtendedJSON as
-// BSON representations. The types in this package enable a flexible system for handling this
-// encoding and decoding.
-//
-// The codec system is composed of two parts:
-//
-// 1) ValueEncoders and ValueDecoders that handle encoding and decoding Go values to and from BSON
-// representations.
-//
-// 2) A Registry that holds these ValueEncoders and ValueDecoders and provides methods for
-// retrieving them.
-//
-// # ValueEncoders and ValueDecoders
-//
-// The ValueEncoder interface is implemented by types that can encode a provided Go type to BSON.
-// The value to encode is provided as a reflect.Value and a bsonrw.ValueWriter is used within the
-// EncodeValue method to actually create the BSON representation. For convenience, ValueEncoderFunc
-// is provided to allow use of a function with the correct signature as a ValueEncoder. An
-// EncodeContext instance is provided to allow implementations to lookup further ValueEncoders and
-// to provide configuration information.
-//
-// The ValueDecoder interface is the inverse of the ValueEncoder. Implementations should ensure that
-// the value they receive is settable. Similar to ValueEncoderFunc, ValueDecoderFunc is provided to
-// allow the use of a function with the correct signature as a ValueDecoder. A DecodeContext
-// instance is provided and serves similar functionality to the EncodeContext.
-//
-// # Registry
-//
-// A Registry is a store for ValueEncoders, ValueDecoders, and a type map. See the Registry type
-// documentation for examples of registering various custom encoders and decoders. A Registry can
-// have three main types of codecs:
-//
-// 1. Type encoders/decoders - These can be registered using the RegisterTypeEncoder and
-// RegisterTypeDecoder methods. The registered codec will be invoked when encoding/decoding a value
-// whose type matches the registered type exactly.
-// If the registered type is an interface, the codec will be invoked when encoding or decoding
-// values whose type is the interface, but not for values with concrete types that implement the
-// interface.
-//
-// 2. Hook encoders/decoders - These can be registered using the RegisterHookEncoder and
-// RegisterHookDecoder methods. These methods only accept interface types and the registered codecs
-// will be invoked when encoding or decoding values whose types implement the interface. An example
-// of a hook defined by the driver is bson.Marshaler. The driver will call the MarshalBSON method
-// for any value whose type implements bson.Marshaler, regardless of the value's concrete type.
-//
-// 3. Type map entries - This can be used to associate a BSON type with a Go type. These type
-// associations are used when decoding into a bson.D/bson.M or a struct field of type interface{}.
-// For example, by default, BSON int32 and int64 values decode as Go int32 and int64 instances,
-// respectively, when decoding into a bson.D. The following code would change the behavior so these
-// values decode as Go int instances instead:
-//
-// intType := reflect.TypeOf(int(0))
-// registry.RegisterTypeMapEntry(bsontype.Int32, intType).RegisterTypeMapEntry(bsontype.Int64, intType)
-//
-// 4. Kind encoder/decoders - These can be registered using the RegisterDefaultEncoder and
-// RegisterDefaultDecoder methods. The registered codec will be invoked when encoding or decoding
-// values whose reflect.Kind matches the registered reflect.Kind as long as the value's type doesn't
-// match a registered type or hook encoder/decoder first. These methods should be used to change the
-// behavior for all values for a specific kind.
-//
-// # Registry Lookup Procedure
-//
-// When looking up an encoder in a Registry, the precedence rules are as follows:
-//
-// 1. A type encoder registered for the exact type of the value.
-//
-// 2. A hook encoder registered for an interface that is implemented by the value or by a pointer to
-// the value. If the value matches multiple hooks (e.g. the type implements bsoncodec.Marshaler and
-// bsoncodec.ValueMarshaler), the first one registered will be selected. Note that registries
-// constructed using bson.NewRegistry have driver-defined hooks registered for the
-// bsoncodec.Marshaler, bsoncodec.ValueMarshaler, and bsoncodec.Proxy interfaces, so those will take
-// precedence over any new hooks.
-//
-// 3. A kind encoder registered for the value's kind.
-//
-// If all of these lookups fail to find an encoder, an error of type ErrNoEncoder is returned. The
-// same precedence rules apply for decoders, with the exception that an error of type ErrNoDecoder
-// will be returned if no decoder is found.
-//
-// # DefaultValueEncoders and DefaultValueDecoders
-//
-// The DefaultValueEncoders and DefaultValueDecoders types provide a full set of ValueEncoders and
-// ValueDecoders for handling a wide range of Go types, including all of the types within the
-// primitive package. To make registering these codecs easier, a helper method on each type is
-// provided. For the DefaultValueEncoders type the method is called RegisterDefaultEncoders and for
-// the DefaultValueDecoders type the method is called RegisterDefaultDecoders, this method also
-// handles registering type map entries for each BSON type.
-package bsoncodec
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/empty_interface_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/empty_interface_codec.go
deleted file mode 100644
index 098368f07..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/empty_interface_codec.go
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "reflect"
-
- "go.mongodb.org/mongo-driver/bson/bsonoptions"
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
- "go.mongodb.org/mongo-driver/bson/primitive"
-)
-
-// EmptyInterfaceCodec is the Codec used for interface{} values.
-//
-// Deprecated: EmptyInterfaceCodec will not be directly configurable in Go
-// Driver 2.0. To configure the empty interface encode and decode behavior, use
-// the configuration methods on a [go.mongodb.org/mongo-driver/bson.Encoder] or
-// [go.mongodb.org/mongo-driver/bson.Decoder]. To configure the empty interface
-// encode and decode behavior for a mongo.Client, use
-// [go.mongodb.org/mongo-driver/mongo/options.ClientOptions.SetBSONOptions].
-//
-// For example, to configure a mongo.Client to unmarshal BSON binary field
-// values as a Go byte slice, use:
-//
-// opt := options.Client().SetBSONOptions(&options.BSONOptions{
-// BinaryAsSlice: true,
-// })
-//
-// See the deprecation notice for each field in EmptyInterfaceCodec for the
-// corresponding settings.
-type EmptyInterfaceCodec struct {
- // DecodeBinaryAsSlice causes DecodeValue to unmarshal BSON binary field values that are the
- // "Generic" or "Old" BSON binary subtype as a Go byte slice instead of a primitive.Binary.
- //
- // Deprecated: Use bson.Decoder.BinaryAsSlice or options.BSONOptions.BinaryAsSlice instead.
- DecodeBinaryAsSlice bool
-}
-
-var (
- defaultEmptyInterfaceCodec = NewEmptyInterfaceCodec()
-
- // Assert that defaultEmptyInterfaceCodec satisfies the typeDecoder interface, which allows it
- // to be used by collection type decoders (e.g. map, slice, etc) to set individual values in a
- // collection.
- _ typeDecoder = defaultEmptyInterfaceCodec
-)
-
-// NewEmptyInterfaceCodec returns a EmptyInterfaceCodec with options opts.
-//
-// Deprecated: NewEmptyInterfaceCodec will not be available in Go Driver 2.0. See
-// [EmptyInterfaceCodec] for more details.
-func NewEmptyInterfaceCodec(opts ...*bsonoptions.EmptyInterfaceCodecOptions) *EmptyInterfaceCodec {
- interfaceOpt := bsonoptions.MergeEmptyInterfaceCodecOptions(opts...)
-
- codec := EmptyInterfaceCodec{}
- if interfaceOpt.DecodeBinaryAsSlice != nil {
- codec.DecodeBinaryAsSlice = *interfaceOpt.DecodeBinaryAsSlice
- }
- return &codec
-}
-
-// EncodeValue is the ValueEncoderFunc for interface{}.
-func (eic EmptyInterfaceCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tEmpty {
- return ValueEncoderError{Name: "EmptyInterfaceEncodeValue", Types: []reflect.Type{tEmpty}, Received: val}
- }
-
- if val.IsNil() {
- return vw.WriteNull()
- }
- encoder, err := ec.LookupEncoder(val.Elem().Type())
- if err != nil {
- return err
- }
-
- return encoder.EncodeValue(ec, vw, val.Elem())
-}
-
-func (eic EmptyInterfaceCodec) getEmptyInterfaceDecodeType(dc DecodeContext, valueType bsontype.Type) (reflect.Type, error) {
- isDocument := valueType == bsontype.Type(0) || valueType == bsontype.EmbeddedDocument
- if isDocument {
- if dc.defaultDocumentType != nil {
- // If the bsontype is an embedded document and the DocumentType is set on the DecodeContext, then return
- // that type.
- return dc.defaultDocumentType, nil
- }
- if dc.Ancestor != nil {
- // Using ancestor information rather than looking up the type map entry forces consistent decoding.
- // If we're decoding into a bson.D, subdocuments should also be decoded as bson.D, even if a type map entry
- // has been registered.
- return dc.Ancestor, nil
- }
- }
-
- rtype, err := dc.LookupTypeMapEntry(valueType)
- if err == nil {
- return rtype, nil
- }
-
- if isDocument {
- // For documents, fallback to looking up a type map entry for bsontype.Type(0) or bsontype.EmbeddedDocument,
- // depending on the original valueType.
- var lookupType bsontype.Type
- switch valueType {
- case bsontype.Type(0):
- lookupType = bsontype.EmbeddedDocument
- case bsontype.EmbeddedDocument:
- lookupType = bsontype.Type(0)
- }
-
- rtype, err = dc.LookupTypeMapEntry(lookupType)
- if err == nil {
- return rtype, nil
- }
- }
-
- return nil, err
-}
-
-func (eic EmptyInterfaceCodec) decodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tEmpty {
- return emptyValue, ValueDecoderError{Name: "EmptyInterfaceDecodeValue", Types: []reflect.Type{tEmpty}, Received: reflect.Zero(t)}
- }
-
- rtype, err := eic.getEmptyInterfaceDecodeType(dc, vr.Type())
- if err != nil {
- switch vr.Type() {
- case bsontype.Null:
- return reflect.Zero(t), vr.ReadNull()
- default:
- return emptyValue, err
- }
- }
-
- decoder, err := dc.LookupDecoder(rtype)
- if err != nil {
- return emptyValue, err
- }
-
- elem, err := decodeTypeOrValue(decoder, dc, vr, rtype)
- if err != nil {
- return emptyValue, err
- }
-
- if (eic.DecodeBinaryAsSlice || dc.binaryAsSlice) && rtype == tBinary {
- binElem := elem.Interface().(primitive.Binary)
- if binElem.Subtype == bsontype.BinaryGeneric || binElem.Subtype == bsontype.BinaryBinaryOld {
- elem = reflect.ValueOf(binElem.Data)
- }
- }
-
- return elem, nil
-}
-
-// DecodeValue is the ValueDecoderFunc for interface{}.
-func (eic EmptyInterfaceCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tEmpty {
- return ValueDecoderError{Name: "EmptyInterfaceDecodeValue", Types: []reflect.Type{tEmpty}, Received: val}
- }
-
- elem, err := eic.decodeType(dc, vr, val.Type())
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/map_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/map_codec.go
deleted file mode 100644
index d7e00ffa8..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/map_codec.go
+++ /dev/null
@@ -1,343 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "encoding"
- "errors"
- "fmt"
- "reflect"
- "strconv"
-
- "go.mongodb.org/mongo-driver/bson/bsonoptions"
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
-)
-
-var defaultMapCodec = NewMapCodec()
-
-// MapCodec is the Codec used for map values.
-//
-// Deprecated: MapCodec will not be directly configurable in Go Driver 2.0. To
-// configure the map encode and decode behavior, use the configuration methods
-// on a [go.mongodb.org/mongo-driver/bson.Encoder] or
-// [go.mongodb.org/mongo-driver/bson.Decoder]. To configure the map encode and
-// decode behavior for a mongo.Client, use
-// [go.mongodb.org/mongo-driver/mongo/options.ClientOptions.SetBSONOptions].
-//
-// For example, to configure a mongo.Client to marshal nil Go maps as empty BSON
-// documents, use:
-//
-// opt := options.Client().SetBSONOptions(&options.BSONOptions{
-// NilMapAsEmpty: true,
-// })
-//
-// See the deprecation notice for each field in MapCodec for the corresponding
-// settings.
-type MapCodec struct {
- // DecodeZerosMap causes DecodeValue to delete any existing values from Go maps in the destination
- // value passed to Decode before unmarshaling BSON documents into them.
- //
- // Deprecated: Use bson.Decoder.ZeroMaps or options.BSONOptions.ZeroMaps instead.
- DecodeZerosMap bool
-
- // EncodeNilAsEmpty causes EncodeValue to marshal nil Go maps as empty BSON documents instead of
- // BSON null.
- //
- // Deprecated: Use bson.Encoder.NilMapAsEmpty or options.BSONOptions.NilMapAsEmpty instead.
- EncodeNilAsEmpty bool
-
- // EncodeKeysWithStringer causes the Encoder to convert Go map keys to BSON document field name
- // strings using fmt.Sprintf() instead of the default string conversion logic.
- //
- // Deprecated: Use bson.Encoder.StringifyMapKeysWithFmt or
- // options.BSONOptions.StringifyMapKeysWithFmt instead.
- EncodeKeysWithStringer bool
-}
-
-// KeyMarshaler is the interface implemented by an object that can marshal itself into a string key.
-// This applies to types used as map keys and is similar to encoding.TextMarshaler.
-type KeyMarshaler interface {
- MarshalKey() (key string, err error)
-}
-
-// KeyUnmarshaler is the interface implemented by an object that can unmarshal a string representation
-// of itself. This applies to types used as map keys and is similar to encoding.TextUnmarshaler.
-//
-// UnmarshalKey must be able to decode the form generated by MarshalKey.
-// UnmarshalKey must copy the text if it wishes to retain the text
-// after returning.
-type KeyUnmarshaler interface {
- UnmarshalKey(key string) error
-}
-
-// NewMapCodec returns a MapCodec with options opts.
-//
-// Deprecated: NewMapCodec will not be available in Go Driver 2.0. See
-// [MapCodec] for more details.
-func NewMapCodec(opts ...*bsonoptions.MapCodecOptions) *MapCodec {
- mapOpt := bsonoptions.MergeMapCodecOptions(opts...)
-
- codec := MapCodec{}
- if mapOpt.DecodeZerosMap != nil {
- codec.DecodeZerosMap = *mapOpt.DecodeZerosMap
- }
- if mapOpt.EncodeNilAsEmpty != nil {
- codec.EncodeNilAsEmpty = *mapOpt.EncodeNilAsEmpty
- }
- if mapOpt.EncodeKeysWithStringer != nil {
- codec.EncodeKeysWithStringer = *mapOpt.EncodeKeysWithStringer
- }
- return &codec
-}
-
-// EncodeValue is the ValueEncoder for map[*]* types.
-func (mc *MapCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Kind() != reflect.Map {
- return ValueEncoderError{Name: "MapEncodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val}
- }
-
- if val.IsNil() && !mc.EncodeNilAsEmpty && !ec.nilMapAsEmpty {
- // If we have a nil map but we can't WriteNull, that means we're probably trying to encode
- // to a TopLevel document. We can't currently tell if this is what actually happened, but if
- // there's a deeper underlying problem, the error will also be returned from WriteDocument,
- // so just continue. The operations on a map reflection value are valid, so we can call
- // MapKeys within mapEncodeValue without a problem.
- err := vw.WriteNull()
- if err == nil {
- return nil
- }
- }
-
- dw, err := vw.WriteDocument()
- if err != nil {
- return err
- }
-
- return mc.mapEncodeValue(ec, dw, val, nil)
-}
-
-// mapEncodeValue handles encoding of the values of a map. The collisionFn returns
-// true if the provided key exists, this is mainly used for inline maps in the
-// struct codec.
-func (mc *MapCodec) mapEncodeValue(ec EncodeContext, dw bsonrw.DocumentWriter, val reflect.Value, collisionFn func(string) bool) error {
-
- elemType := val.Type().Elem()
- encoder, err := ec.LookupEncoder(elemType)
- if err != nil && elemType.Kind() != reflect.Interface {
- return err
- }
-
- keys := val.MapKeys()
- for _, key := range keys {
- keyStr, err := mc.encodeKey(key, ec.stringifyMapKeysWithFmt)
- if err != nil {
- return err
- }
-
- if collisionFn != nil && collisionFn(keyStr) {
- return fmt.Errorf("Key %s of inlined map conflicts with a struct field name", key)
- }
-
- currEncoder, currVal, lookupErr := defaultValueEncoders.lookupElementEncoder(ec, encoder, val.MapIndex(key))
- if lookupErr != nil && !errors.Is(lookupErr, errInvalidValue) {
- return lookupErr
- }
-
- vw, err := dw.WriteDocumentElement(keyStr)
- if err != nil {
- return err
- }
-
- if errors.Is(lookupErr, errInvalidValue) {
- err = vw.WriteNull()
- if err != nil {
- return err
- }
- continue
- }
-
- err = currEncoder.EncodeValue(ec, vw, currVal)
- if err != nil {
- return err
- }
- }
-
- return dw.WriteDocumentEnd()
-}
-
-// DecodeValue is the ValueDecoder for map[string/decimal]* types.
-func (mc *MapCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if val.Kind() != reflect.Map || (!val.CanSet() && val.IsNil()) {
- return ValueDecoderError{Name: "MapDecodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val}
- }
-
- switch vrType := vr.Type(); vrType {
- case bsontype.Type(0), bsontype.EmbeddedDocument:
- case bsontype.Null:
- val.Set(reflect.Zero(val.Type()))
- return vr.ReadNull()
- case bsontype.Undefined:
- val.Set(reflect.Zero(val.Type()))
- return vr.ReadUndefined()
- default:
- return fmt.Errorf("cannot decode %v into a %s", vrType, val.Type())
- }
-
- dr, err := vr.ReadDocument()
- if err != nil {
- return err
- }
-
- if val.IsNil() {
- val.Set(reflect.MakeMap(val.Type()))
- }
-
- if val.Len() > 0 && (mc.DecodeZerosMap || dc.zeroMaps) {
- clearMap(val)
- }
-
- eType := val.Type().Elem()
- decoder, err := dc.LookupDecoder(eType)
- if err != nil {
- return err
- }
- eTypeDecoder, _ := decoder.(typeDecoder)
-
- if eType == tEmpty {
- dc.Ancestor = val.Type()
- }
-
- keyType := val.Type().Key()
-
- for {
- key, vr, err := dr.ReadElement()
- if errors.Is(err, bsonrw.ErrEOD) {
- break
- }
- if err != nil {
- return err
- }
-
- k, err := mc.decodeKey(key, keyType)
- if err != nil {
- return err
- }
-
- elem, err := decodeTypeOrValueWithInfo(decoder, eTypeDecoder, dc, vr, eType, true)
- if err != nil {
- return newDecodeError(key, err)
- }
-
- val.SetMapIndex(k, elem)
- }
- return nil
-}
-
-func clearMap(m reflect.Value) {
- var none reflect.Value
- for _, k := range m.MapKeys() {
- m.SetMapIndex(k, none)
- }
-}
-
-func (mc *MapCodec) encodeKey(val reflect.Value, encodeKeysWithStringer bool) (string, error) {
- if mc.EncodeKeysWithStringer || encodeKeysWithStringer {
- return fmt.Sprint(val), nil
- }
-
- // keys of any string type are used directly
- if val.Kind() == reflect.String {
- return val.String(), nil
- }
- // KeyMarshalers are marshaled
- if km, ok := val.Interface().(KeyMarshaler); ok {
- if val.Kind() == reflect.Ptr && val.IsNil() {
- return "", nil
- }
- buf, err := km.MarshalKey()
- if err == nil {
- return buf, nil
- }
- return "", err
- }
- // keys implement encoding.TextMarshaler are marshaled.
- if km, ok := val.Interface().(encoding.TextMarshaler); ok {
- if val.Kind() == reflect.Ptr && val.IsNil() {
- return "", nil
- }
-
- buf, err := km.MarshalText()
- if err != nil {
- return "", err
- }
-
- return string(buf), nil
- }
-
- switch val.Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return strconv.FormatInt(val.Int(), 10), nil
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- return strconv.FormatUint(val.Uint(), 10), nil
- }
- return "", fmt.Errorf("unsupported key type: %v", val.Type())
-}
-
-var keyUnmarshalerType = reflect.TypeOf((*KeyUnmarshaler)(nil)).Elem()
-var textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
-
-func (mc *MapCodec) decodeKey(key string, keyType reflect.Type) (reflect.Value, error) {
- keyVal := reflect.ValueOf(key)
- var err error
- switch {
- // First, if EncodeKeysWithStringer is not enabled, try to decode withKeyUnmarshaler
- case !mc.EncodeKeysWithStringer && reflect.PtrTo(keyType).Implements(keyUnmarshalerType):
- keyVal = reflect.New(keyType)
- v := keyVal.Interface().(KeyUnmarshaler)
- err = v.UnmarshalKey(key)
- keyVal = keyVal.Elem()
- // Try to decode encoding.TextUnmarshalers.
- case reflect.PtrTo(keyType).Implements(textUnmarshalerType):
- keyVal = reflect.New(keyType)
- v := keyVal.Interface().(encoding.TextUnmarshaler)
- err = v.UnmarshalText([]byte(key))
- keyVal = keyVal.Elem()
- // Otherwise, go to type specific behavior
- default:
- switch keyType.Kind() {
- case reflect.String:
- keyVal = reflect.ValueOf(key).Convert(keyType)
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- n, parseErr := strconv.ParseInt(key, 10, 64)
- if parseErr != nil || reflect.Zero(keyType).OverflowInt(n) {
- err = fmt.Errorf("failed to unmarshal number key %v", key)
- }
- keyVal = reflect.ValueOf(n).Convert(keyType)
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
- n, parseErr := strconv.ParseUint(key, 10, 64)
- if parseErr != nil || reflect.Zero(keyType).OverflowUint(n) {
- err = fmt.Errorf("failed to unmarshal number key %v", key)
- break
- }
- keyVal = reflect.ValueOf(n).Convert(keyType)
- case reflect.Float32, reflect.Float64:
- if mc.EncodeKeysWithStringer {
- parsed, err := strconv.ParseFloat(key, 64)
- if err != nil {
- return keyVal, fmt.Errorf("Map key is defined to be a decimal type (%v) but got error %w", keyType.Kind(), err)
- }
- keyVal = reflect.ValueOf(parsed)
- break
- }
- fallthrough
- default:
- return keyVal, fmt.Errorf("unsupported key type: %v", keyType)
- }
- }
- return keyVal, err
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/mode.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/mode.go
deleted file mode 100644
index fbd9f0a9e..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/mode.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import "fmt"
-
-type mode int
-
-const (
- _ mode = iota
- mTopLevel
- mDocument
- mArray
- mValue
- mElement
- mCodeWithScope
- mSpacer
-)
-
-func (m mode) String() string {
- var str string
-
- switch m {
- case mTopLevel:
- str = "TopLevel"
- case mDocument:
- str = "DocumentMode"
- case mArray:
- str = "ArrayMode"
- case mValue:
- str = "ValueMode"
- case mElement:
- str = "ElementMode"
- case mCodeWithScope:
- str = "CodeWithScopeMode"
- case mSpacer:
- str = "CodeWithScopeSpacerFrame"
- default:
- str = "UnknownMode"
- }
-
- return str
-}
-
-// TransitionError is an error returned when an invalid progressing a
-// ValueReader or ValueWriter state machine occurs.
-type TransitionError struct {
- parent mode
- current mode
- destination mode
-}
-
-func (te TransitionError) Error() string {
- if te.destination == mode(0) {
- return fmt.Sprintf("invalid state transition: cannot read/write value while in %s", te.current)
- }
- if te.parent == mode(0) {
- return fmt.Sprintf("invalid state transition: %s -> %s", te.current, te.destination)
- }
- return fmt.Sprintf("invalid state transition: %s -> %s; parent %s", te.current, te.destination, te.parent)
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/pointer_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/pointer_codec.go
deleted file mode 100644
index ddfa4a33e..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/pointer_codec.go
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "reflect"
-
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
-)
-
-var _ ValueEncoder = &PointerCodec{}
-var _ ValueDecoder = &PointerCodec{}
-
-// PointerCodec is the Codec used for pointers.
-//
-// Deprecated: PointerCodec will not be directly accessible in Go Driver 2.0. To
-// override the default pointer encode and decode behavior, create a new registry
-// with [go.mongodb.org/mongo-driver/bson.NewRegistry] and register a new
-// encoder and decoder for pointers.
-//
-// For example,
-//
-// reg := bson.NewRegistry()
-// reg.RegisterKindEncoder(reflect.Ptr, myPointerEncoder)
-// reg.RegisterKindDecoder(reflect.Ptr, myPointerDecoder)
-type PointerCodec struct {
- ecache typeEncoderCache
- dcache typeDecoderCache
-}
-
-// NewPointerCodec returns a PointerCodec that has been initialized.
-//
-// Deprecated: NewPointerCodec will not be available in Go Driver 2.0. See
-// [PointerCodec] for more details.
-func NewPointerCodec() *PointerCodec {
- return &PointerCodec{}
-}
-
-// EncodeValue handles encoding a pointer by either encoding it to BSON Null if the pointer is nil
-// or looking up an encoder for the type of value the pointer points to.
-func (pc *PointerCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if val.Kind() != reflect.Ptr {
- if !val.IsValid() {
- return vw.WriteNull()
- }
- return ValueEncoderError{Name: "PointerCodec.EncodeValue", Kinds: []reflect.Kind{reflect.Ptr}, Received: val}
- }
-
- if val.IsNil() {
- return vw.WriteNull()
- }
-
- typ := val.Type()
- if v, ok := pc.ecache.Load(typ); ok {
- if v == nil {
- return ErrNoEncoder{Type: typ}
- }
- return v.EncodeValue(ec, vw, val.Elem())
- }
- // TODO(charlie): handle concurrent requests for the same type
- enc, err := ec.LookupEncoder(typ.Elem())
- enc = pc.ecache.LoadOrStore(typ, enc)
- if err != nil {
- return err
- }
- return enc.EncodeValue(ec, vw, val.Elem())
-}
-
-// DecodeValue handles decoding a pointer by looking up a decoder for the type it points to and
-// using that to decode. If the BSON value is Null, this method will set the pointer to nil.
-func (pc *PointerCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Kind() != reflect.Ptr {
- return ValueDecoderError{Name: "PointerCodec.DecodeValue", Kinds: []reflect.Kind{reflect.Ptr}, Received: val}
- }
-
- typ := val.Type()
- if vr.Type() == bsontype.Null {
- val.Set(reflect.Zero(typ))
- return vr.ReadNull()
- }
- if vr.Type() == bsontype.Undefined {
- val.Set(reflect.Zero(typ))
- return vr.ReadUndefined()
- }
-
- if val.IsNil() {
- val.Set(reflect.New(typ.Elem()))
- }
-
- if v, ok := pc.dcache.Load(typ); ok {
- if v == nil {
- return ErrNoDecoder{Type: typ}
- }
- return v.DecodeValue(dc, vr, val.Elem())
- }
- // TODO(charlie): handle concurrent requests for the same type
- dec, err := dc.LookupDecoder(typ.Elem())
- dec = pc.dcache.LoadOrStore(typ, dec)
- if err != nil {
- return err
- }
- return dec.DecodeValue(dc, vr, val.Elem())
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/proxy.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/proxy.go
deleted file mode 100644
index 4cf2b01ab..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/proxy.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-// Proxy is an interface implemented by types that cannot themselves be directly encoded. Types
-// that implement this interface with have ProxyBSON called during the encoding process and that
-// value will be encoded in place for the implementer.
-type Proxy interface {
- ProxyBSON() (interface{}, error)
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go
deleted file mode 100644
index 196c491bb..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/registry.go
+++ /dev/null
@@ -1,524 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "errors"
- "fmt"
- "reflect"
- "sync"
-
- "go.mongodb.org/mongo-driver/bson/bsontype"
-)
-
-// ErrNilType is returned when nil is passed to either LookupEncoder or LookupDecoder.
-//
-// Deprecated: ErrNilType will not be supported in Go Driver 2.0.
-var ErrNilType = errors.New("cannot perform a decoder lookup on <nil>")
-
-// ErrNotPointer is returned when a non-pointer type is provided to LookupDecoder.
-//
-// Deprecated: ErrNotPointer will not be supported in Go Driver 2.0.
-var ErrNotPointer = errors.New("non-pointer provided to LookupDecoder")
-
-// ErrNoEncoder is returned when there wasn't an encoder available for a type.
-//
-// Deprecated: ErrNoEncoder will not be supported in Go Driver 2.0.
-type ErrNoEncoder struct {
- Type reflect.Type
-}
-
-func (ene ErrNoEncoder) Error() string {
- if ene.Type == nil {
- return "no encoder found for <nil>"
- }
- return "no encoder found for " + ene.Type.String()
-}
-
-// ErrNoDecoder is returned when there wasn't a decoder available for a type.
-//
-// Deprecated: ErrNoDecoder will not be supported in Go Driver 2.0.
-type ErrNoDecoder struct {
- Type reflect.Type
-}
-
-func (end ErrNoDecoder) Error() string {
- return "no decoder found for " + end.Type.String()
-}
-
-// ErrNoTypeMapEntry is returned when there wasn't a type available for the provided BSON type.
-//
-// Deprecated: ErrNoTypeMapEntry will not be supported in Go Driver 2.0.
-type ErrNoTypeMapEntry struct {
- Type bsontype.Type
-}
-
-func (entme ErrNoTypeMapEntry) Error() string {
- return "no type map entry found for " + entme.Type.String()
-}
-
-// ErrNotInterface is returned when the provided type is not an interface.
-//
-// Deprecated: ErrNotInterface will not be supported in Go Driver 2.0.
-var ErrNotInterface = errors.New("The provided type is not an interface")
-
-// A RegistryBuilder is used to build a Registry. This type is not goroutine
-// safe.
-//
-// Deprecated: Use Registry instead.
-type RegistryBuilder struct {
- registry *Registry
-}
-
-// NewRegistryBuilder creates a new empty RegistryBuilder.
-//
-// Deprecated: Use NewRegistry instead.
-func NewRegistryBuilder() *RegistryBuilder {
- return &RegistryBuilder{
- registry: NewRegistry(),
- }
-}
-
-// RegisterCodec will register the provided ValueCodec for the provided type.
-//
-// Deprecated: Use Registry.RegisterTypeEncoder and Registry.RegisterTypeDecoder instead.
-func (rb *RegistryBuilder) RegisterCodec(t reflect.Type, codec ValueCodec) *RegistryBuilder {
- rb.RegisterTypeEncoder(t, codec)
- rb.RegisterTypeDecoder(t, codec)
- return rb
-}
-
-// RegisterTypeEncoder will register the provided ValueEncoder for the provided type.
-//
-// The type will be used directly, so an encoder can be registered for a type and a different encoder can be registered
-// for a pointer to that type.
-//
-// If the given type is an interface, the encoder will be called when marshaling a type that is that interface. It
-// will not be called when marshaling a non-interface type that implements the interface.
-//
-// Deprecated: Use Registry.RegisterTypeEncoder instead.
-func (rb *RegistryBuilder) RegisterTypeEncoder(t reflect.Type, enc ValueEncoder) *RegistryBuilder {
- rb.registry.RegisterTypeEncoder(t, enc)
- return rb
-}
-
-// RegisterHookEncoder will register an encoder for the provided interface type t. This encoder will be called when
-// marshaling a type if the type implements t or a pointer to the type implements t. If the provided type is not
-// an interface (i.e. t.Kind() != reflect.Interface), this method will panic.
-//
-// Deprecated: Use Registry.RegisterInterfaceEncoder instead.
-func (rb *RegistryBuilder) RegisterHookEncoder(t reflect.Type, enc ValueEncoder) *RegistryBuilder {
- rb.registry.RegisterInterfaceEncoder(t, enc)
- return rb
-}
-
-// RegisterTypeDecoder will register the provided ValueDecoder for the provided type.
-//
-// The type will be used directly, so a decoder can be registered for a type and a different decoder can be registered
-// for a pointer to that type.
-//
-// If the given type is an interface, the decoder will be called when unmarshaling into a type that is that interface.
-// It will not be called when unmarshaling into a non-interface type that implements the interface.
-//
-// Deprecated: Use Registry.RegisterTypeDecoder instead.
-func (rb *RegistryBuilder) RegisterTypeDecoder(t reflect.Type, dec ValueDecoder) *RegistryBuilder {
- rb.registry.RegisterTypeDecoder(t, dec)
- return rb
-}
-
-// RegisterHookDecoder will register an decoder for the provided interface type t. This decoder will be called when
-// unmarshaling into a type if the type implements t or a pointer to the type implements t. If the provided type is not
-// an interface (i.e. t.Kind() != reflect.Interface), this method will panic.
-//
-// Deprecated: Use Registry.RegisterInterfaceDecoder instead.
-func (rb *RegistryBuilder) RegisterHookDecoder(t reflect.Type, dec ValueDecoder) *RegistryBuilder {
- rb.registry.RegisterInterfaceDecoder(t, dec)
- return rb
-}
-
-// RegisterEncoder registers the provided type and encoder pair.
-//
-// Deprecated: Use Registry.RegisterTypeEncoder or Registry.RegisterInterfaceEncoder instead.
-func (rb *RegistryBuilder) RegisterEncoder(t reflect.Type, enc ValueEncoder) *RegistryBuilder {
- if t == tEmpty {
- rb.registry.RegisterTypeEncoder(t, enc)
- return rb
- }
- switch t.Kind() {
- case reflect.Interface:
- rb.registry.RegisterInterfaceEncoder(t, enc)
- default:
- rb.registry.RegisterTypeEncoder(t, enc)
- }
- return rb
-}
-
-// RegisterDecoder registers the provided type and decoder pair.
-//
-// Deprecated: Use Registry.RegisterTypeDecoder or Registry.RegisterInterfaceDecoder instead.
-func (rb *RegistryBuilder) RegisterDecoder(t reflect.Type, dec ValueDecoder) *RegistryBuilder {
- if t == nil {
- rb.registry.RegisterTypeDecoder(t, dec)
- return rb
- }
- if t == tEmpty {
- rb.registry.RegisterTypeDecoder(t, dec)
- return rb
- }
- switch t.Kind() {
- case reflect.Interface:
- rb.registry.RegisterInterfaceDecoder(t, dec)
- default:
- rb.registry.RegisterTypeDecoder(t, dec)
- }
- return rb
-}
-
-// RegisterDefaultEncoder will register the provided ValueEncoder to the provided
-// kind.
-//
-// Deprecated: Use Registry.RegisterKindEncoder instead.
-func (rb *RegistryBuilder) RegisterDefaultEncoder(kind reflect.Kind, enc ValueEncoder) *RegistryBuilder {
- rb.registry.RegisterKindEncoder(kind, enc)
- return rb
-}
-
-// RegisterDefaultDecoder will register the provided ValueDecoder to the
-// provided kind.
-//
-// Deprecated: Use Registry.RegisterKindDecoder instead.
-func (rb *RegistryBuilder) RegisterDefaultDecoder(kind reflect.Kind, dec ValueDecoder) *RegistryBuilder {
- rb.registry.RegisterKindDecoder(kind, dec)
- return rb
-}
-
-// RegisterTypeMapEntry will register the provided type to the BSON type. The primary usage for this
-// mapping is decoding situations where an empty interface is used and a default type needs to be
-// created and decoded into.
-//
-// By default, BSON documents will decode into interface{} values as bson.D. To change the default type for BSON
-// documents, a type map entry for bsontype.EmbeddedDocument should be registered. For example, to force BSON documents
-// to decode to bson.Raw, use the following code:
-//
-// rb.RegisterTypeMapEntry(bsontype.EmbeddedDocument, reflect.TypeOf(bson.Raw{}))
-//
-// Deprecated: Use Registry.RegisterTypeMapEntry instead.
-func (rb *RegistryBuilder) RegisterTypeMapEntry(bt bsontype.Type, rt reflect.Type) *RegistryBuilder {
- rb.registry.RegisterTypeMapEntry(bt, rt)
- return rb
-}
-
-// Build creates a Registry from the current state of this RegistryBuilder.
-//
-// Deprecated: Use NewRegistry instead.
-func (rb *RegistryBuilder) Build() *Registry {
- r := &Registry{
- interfaceEncoders: append([]interfaceValueEncoder(nil), rb.registry.interfaceEncoders...),
- interfaceDecoders: append([]interfaceValueDecoder(nil), rb.registry.interfaceDecoders...),
- typeEncoders: rb.registry.typeEncoders.Clone(),
- typeDecoders: rb.registry.typeDecoders.Clone(),
- kindEncoders: rb.registry.kindEncoders.Clone(),
- kindDecoders: rb.registry.kindDecoders.Clone(),
- }
- rb.registry.typeMap.Range(func(k, v interface{}) bool {
- if k != nil && v != nil {
- r.typeMap.Store(k, v)
- }
- return true
- })
- return r
-}
-
-// A Registry is used to store and retrieve codecs for types and interfaces. This type is the main
-// typed passed around and Encoders and Decoders are constructed from it.
-type Registry struct {
- interfaceEncoders []interfaceValueEncoder
- interfaceDecoders []interfaceValueDecoder
- typeEncoders *typeEncoderCache
- typeDecoders *typeDecoderCache
- kindEncoders *kindEncoderCache
- kindDecoders *kindDecoderCache
- typeMap sync.Map // map[bsontype.Type]reflect.Type
-}
-
-// NewRegistry creates a new empty Registry.
-func NewRegistry() *Registry {
- return &Registry{
- typeEncoders: new(typeEncoderCache),
- typeDecoders: new(typeDecoderCache),
- kindEncoders: new(kindEncoderCache),
- kindDecoders: new(kindDecoderCache),
- }
-}
-
-// RegisterTypeEncoder registers the provided ValueEncoder for the provided type.
-//
-// The type will be used as provided, so an encoder can be registered for a type and a different
-// encoder can be registered for a pointer to that type.
-//
-// If the given type is an interface, the encoder will be called when marshaling a type that is
-// that interface. It will not be called when marshaling a non-interface type that implements the
-// interface. To get the latter behavior, call RegisterHookEncoder instead.
-//
-// RegisterTypeEncoder should not be called concurrently with any other Registry method.
-func (r *Registry) RegisterTypeEncoder(valueType reflect.Type, enc ValueEncoder) {
- r.typeEncoders.Store(valueType, enc)
-}
-
-// RegisterTypeDecoder registers the provided ValueDecoder for the provided type.
-//
-// The type will be used as provided, so a decoder can be registered for a type and a different
-// decoder can be registered for a pointer to that type.
-//
-// If the given type is an interface, the decoder will be called when unmarshaling into a type that
-// is that interface. It will not be called when unmarshaling into a non-interface type that
-// implements the interface. To get the latter behavior, call RegisterHookDecoder instead.
-//
-// RegisterTypeDecoder should not be called concurrently with any other Registry method.
-func (r *Registry) RegisterTypeDecoder(valueType reflect.Type, dec ValueDecoder) {
- r.typeDecoders.Store(valueType, dec)
-}
-
-// RegisterKindEncoder registers the provided ValueEncoder for the provided kind.
-//
-// Use RegisterKindEncoder to register an encoder for any type with the same underlying kind. For
-// example, consider the type MyInt defined as
-//
-// type MyInt int32
-//
-// To define an encoder for MyInt and int32, use RegisterKindEncoder like
-//
-// reg.RegisterKindEncoder(reflect.Int32, myEncoder)
-//
-// RegisterKindEncoder should not be called concurrently with any other Registry method.
-func (r *Registry) RegisterKindEncoder(kind reflect.Kind, enc ValueEncoder) {
- r.kindEncoders.Store(kind, enc)
-}
-
-// RegisterKindDecoder registers the provided ValueDecoder for the provided kind.
-//
-// Use RegisterKindDecoder to register a decoder for any type with the same underlying kind. For
-// example, consider the type MyInt defined as
-//
-// type MyInt int32
-//
-// To define an decoder for MyInt and int32, use RegisterKindDecoder like
-//
-// reg.RegisterKindDecoder(reflect.Int32, myDecoder)
-//
-// RegisterKindDecoder should not be called concurrently with any other Registry method.
-func (r *Registry) RegisterKindDecoder(kind reflect.Kind, dec ValueDecoder) {
- r.kindDecoders.Store(kind, dec)
-}
-
-// RegisterInterfaceEncoder registers an encoder for the provided interface type iface. This encoder will
-// be called when marshaling a type if the type implements iface or a pointer to the type
-// implements iface. If the provided type is not an interface
-// (i.e. iface.Kind() != reflect.Interface), this method will panic.
-//
-// RegisterInterfaceEncoder should not be called concurrently with any other Registry method.
-func (r *Registry) RegisterInterfaceEncoder(iface reflect.Type, enc ValueEncoder) {
- if iface.Kind() != reflect.Interface {
- panicStr := fmt.Errorf("RegisterInterfaceEncoder expects a type with kind reflect.Interface, "+
- "got type %s with kind %s", iface, iface.Kind())
- panic(panicStr)
- }
-
- for idx, encoder := range r.interfaceEncoders {
- if encoder.i == iface {
- r.interfaceEncoders[idx].ve = enc
- return
- }
- }
-
- r.interfaceEncoders = append(r.interfaceEncoders, interfaceValueEncoder{i: iface, ve: enc})
-}
-
-// RegisterInterfaceDecoder registers an decoder for the provided interface type iface. This decoder will
-// be called when unmarshaling into a type if the type implements iface or a pointer to the type
-// implements iface. If the provided type is not an interface (i.e. iface.Kind() != reflect.Interface),
-// this method will panic.
-//
-// RegisterInterfaceDecoder should not be called concurrently with any other Registry method.
-func (r *Registry) RegisterInterfaceDecoder(iface reflect.Type, dec ValueDecoder) {
- if iface.Kind() != reflect.Interface {
- panicStr := fmt.Errorf("RegisterInterfaceDecoder expects a type with kind reflect.Interface, "+
- "got type %s with kind %s", iface, iface.Kind())
- panic(panicStr)
- }
-
- for idx, decoder := range r.interfaceDecoders {
- if decoder.i == iface {
- r.interfaceDecoders[idx].vd = dec
- return
- }
- }
-
- r.interfaceDecoders = append(r.interfaceDecoders, interfaceValueDecoder{i: iface, vd: dec})
-}
-
-// RegisterTypeMapEntry will register the provided type to the BSON type. The primary usage for this
-// mapping is decoding situations where an empty interface is used and a default type needs to be
-// created and decoded into.
-//
-// By default, BSON documents will decode into interface{} values as bson.D. To change the default type for BSON
-// documents, a type map entry for bsontype.EmbeddedDocument should be registered. For example, to force BSON documents
-// to decode to bson.Raw, use the following code:
-//
-// reg.RegisterTypeMapEntry(bsontype.EmbeddedDocument, reflect.TypeOf(bson.Raw{}))
-func (r *Registry) RegisterTypeMapEntry(bt bsontype.Type, rt reflect.Type) {
- r.typeMap.Store(bt, rt)
-}
-
-// LookupEncoder returns the first matching encoder in the Registry. It uses the following lookup
-// order:
-//
-// 1. An encoder registered for the exact type. If the given type is an interface, an encoder
-// registered using RegisterTypeEncoder for that interface will be selected.
-//
-// 2. An encoder registered using RegisterInterfaceEncoder for an interface implemented by the type
-// or by a pointer to the type.
-//
-// 3. An encoder registered using RegisterKindEncoder for the kind of value.
-//
-// If no encoder is found, an error of type ErrNoEncoder is returned. LookupEncoder is safe for
-// concurrent use by multiple goroutines after all codecs and encoders are registered.
-func (r *Registry) LookupEncoder(valueType reflect.Type) (ValueEncoder, error) {
- if valueType == nil {
- return nil, ErrNoEncoder{Type: valueType}
- }
- enc, found := r.lookupTypeEncoder(valueType)
- if found {
- if enc == nil {
- return nil, ErrNoEncoder{Type: valueType}
- }
- return enc, nil
- }
-
- enc, found = r.lookupInterfaceEncoder(valueType, true)
- if found {
- return r.typeEncoders.LoadOrStore(valueType, enc), nil
- }
-
- if v, ok := r.kindEncoders.Load(valueType.Kind()); ok {
- return r.storeTypeEncoder(valueType, v), nil
- }
- return nil, ErrNoEncoder{Type: valueType}
-}
-
-func (r *Registry) storeTypeEncoder(rt reflect.Type, enc ValueEncoder) ValueEncoder {
- return r.typeEncoders.LoadOrStore(rt, enc)
-}
-
-func (r *Registry) lookupTypeEncoder(rt reflect.Type) (ValueEncoder, bool) {
- return r.typeEncoders.Load(rt)
-}
-
-func (r *Registry) lookupInterfaceEncoder(valueType reflect.Type, allowAddr bool) (ValueEncoder, bool) {
- if valueType == nil {
- return nil, false
- }
- for _, ienc := range r.interfaceEncoders {
- if valueType.Implements(ienc.i) {
- return ienc.ve, true
- }
- if allowAddr && valueType.Kind() != reflect.Ptr && reflect.PtrTo(valueType).Implements(ienc.i) {
- // if *t implements an interface, this will catch if t implements an interface further
- // ahead in interfaceEncoders
- defaultEnc, found := r.lookupInterfaceEncoder(valueType, false)
- if !found {
- defaultEnc, _ = r.kindEncoders.Load(valueType.Kind())
- }
- return newCondAddrEncoder(ienc.ve, defaultEnc), true
- }
- }
- return nil, false
-}
-
-// LookupDecoder returns the first matching decoder in the Registry. It uses the following lookup
-// order:
-//
-// 1. A decoder registered for the exact type. If the given type is an interface, a decoder
-// registered using RegisterTypeDecoder for that interface will be selected.
-//
-// 2. A decoder registered using RegisterInterfaceDecoder for an interface implemented by the type or by
-// a pointer to the type.
-//
-// 3. A decoder registered using RegisterKindDecoder for the kind of value.
-//
-// If no decoder is found, an error of type ErrNoDecoder is returned. LookupDecoder is safe for
-// concurrent use by multiple goroutines after all codecs and decoders are registered.
-func (r *Registry) LookupDecoder(valueType reflect.Type) (ValueDecoder, error) {
- if valueType == nil {
- return nil, ErrNilType
- }
- dec, found := r.lookupTypeDecoder(valueType)
- if found {
- if dec == nil {
- return nil, ErrNoDecoder{Type: valueType}
- }
- return dec, nil
- }
-
- dec, found = r.lookupInterfaceDecoder(valueType, true)
- if found {
- return r.storeTypeDecoder(valueType, dec), nil
- }
-
- if v, ok := r.kindDecoders.Load(valueType.Kind()); ok {
- return r.storeTypeDecoder(valueType, v), nil
- }
- return nil, ErrNoDecoder{Type: valueType}
-}
-
-func (r *Registry) lookupTypeDecoder(valueType reflect.Type) (ValueDecoder, bool) {
- return r.typeDecoders.Load(valueType)
-}
-
-func (r *Registry) storeTypeDecoder(typ reflect.Type, dec ValueDecoder) ValueDecoder {
- return r.typeDecoders.LoadOrStore(typ, dec)
-}
-
-func (r *Registry) lookupInterfaceDecoder(valueType reflect.Type, allowAddr bool) (ValueDecoder, bool) {
- for _, idec := range r.interfaceDecoders {
- if valueType.Implements(idec.i) {
- return idec.vd, true
- }
- if allowAddr && valueType.Kind() != reflect.Ptr && reflect.PtrTo(valueType).Implements(idec.i) {
- // if *t implements an interface, this will catch if t implements an interface further
- // ahead in interfaceDecoders
- defaultDec, found := r.lookupInterfaceDecoder(valueType, false)
- if !found {
- defaultDec, _ = r.kindDecoders.Load(valueType.Kind())
- }
- return newCondAddrDecoder(idec.vd, defaultDec), true
- }
- }
- return nil, false
-}
-
-// LookupTypeMapEntry inspects the registry's type map for a Go type for the corresponding BSON
-// type. If no type is found, ErrNoTypeMapEntry is returned.
-//
-// LookupTypeMapEntry should not be called concurrently with any other Registry method.
-func (r *Registry) LookupTypeMapEntry(bt bsontype.Type) (reflect.Type, error) {
- v, ok := r.typeMap.Load(bt)
- if v == nil || !ok {
- return nil, ErrNoTypeMapEntry{Type: bt}
- }
- return v.(reflect.Type), nil
-}
-
-type interfaceValueEncoder struct {
- i reflect.Type
- ve ValueEncoder
-}
-
-type interfaceValueDecoder struct {
- i reflect.Type
- vd ValueDecoder
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/slice_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/slice_codec.go
deleted file mode 100644
index 14c9fd256..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/slice_codec.go
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "errors"
- "fmt"
- "reflect"
-
- "go.mongodb.org/mongo-driver/bson/bsonoptions"
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
- "go.mongodb.org/mongo-driver/bson/primitive"
-)
-
-var defaultSliceCodec = NewSliceCodec()
-
-// SliceCodec is the Codec used for slice values.
-//
-// Deprecated: SliceCodec will not be directly configurable in Go Driver 2.0. To
-// configure the slice encode and decode behavior, use the configuration methods
-// on a [go.mongodb.org/mongo-driver/bson.Encoder] or
-// [go.mongodb.org/mongo-driver/bson.Decoder]. To configure the slice encode and
-// decode behavior for a mongo.Client, use
-// [go.mongodb.org/mongo-driver/mongo/options.ClientOptions.SetBSONOptions].
-//
-// For example, to configure a mongo.Client to marshal nil Go slices as empty
-// BSON arrays, use:
-//
-// opt := options.Client().SetBSONOptions(&options.BSONOptions{
-// NilSliceAsEmpty: true,
-// })
-//
-// See the deprecation notice for each field in SliceCodec for the corresponding
-// settings.
-type SliceCodec struct {
- // EncodeNilAsEmpty causes EncodeValue to marshal nil Go slices as empty BSON arrays instead of
- // BSON null.
- //
- // Deprecated: Use bson.Encoder.NilSliceAsEmpty instead.
- EncodeNilAsEmpty bool
-}
-
-// NewSliceCodec returns a MapCodec with options opts.
-//
-// Deprecated: NewSliceCodec will not be available in Go Driver 2.0. See
-// [SliceCodec] for more details.
-func NewSliceCodec(opts ...*bsonoptions.SliceCodecOptions) *SliceCodec {
- sliceOpt := bsonoptions.MergeSliceCodecOptions(opts...)
-
- codec := SliceCodec{}
- if sliceOpt.EncodeNilAsEmpty != nil {
- codec.EncodeNilAsEmpty = *sliceOpt.EncodeNilAsEmpty
- }
- return &codec
-}
-
-// EncodeValue is the ValueEncoder for slice types.
-func (sc SliceCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Kind() != reflect.Slice {
- return ValueEncoderError{Name: "SliceEncodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val}
- }
-
- if val.IsNil() && !sc.EncodeNilAsEmpty && !ec.nilSliceAsEmpty {
- return vw.WriteNull()
- }
-
- // If we have a []byte we want to treat it as a binary instead of as an array.
- if val.Type().Elem() == tByte {
- byteSlice := make([]byte, val.Len())
- reflect.Copy(reflect.ValueOf(byteSlice), val)
- return vw.WriteBinary(byteSlice)
- }
-
- // If we have a []primitive.E we want to treat it as a document instead of as an array.
- if val.Type() == tD || val.Type().ConvertibleTo(tD) {
- d := val.Convert(tD).Interface().(primitive.D)
-
- dw, err := vw.WriteDocument()
- if err != nil {
- return err
- }
-
- for _, e := range d {
- err = encodeElement(ec, dw, e)
- if err != nil {
- return err
- }
- }
-
- return dw.WriteDocumentEnd()
- }
-
- aw, err := vw.WriteArray()
- if err != nil {
- return err
- }
-
- elemType := val.Type().Elem()
- encoder, err := ec.LookupEncoder(elemType)
- if err != nil && elemType.Kind() != reflect.Interface {
- return err
- }
-
- for idx := 0; idx < val.Len(); idx++ {
- currEncoder, currVal, lookupErr := defaultValueEncoders.lookupElementEncoder(ec, encoder, val.Index(idx))
- if lookupErr != nil && !errors.Is(lookupErr, errInvalidValue) {
- return lookupErr
- }
-
- vw, err := aw.WriteArrayElement()
- if err != nil {
- return err
- }
-
- if errors.Is(lookupErr, errInvalidValue) {
- err = vw.WriteNull()
- if err != nil {
- return err
- }
- continue
- }
-
- err = currEncoder.EncodeValue(ec, vw, currVal)
- if err != nil {
- return err
- }
- }
- return aw.WriteArrayEnd()
-}
-
-// DecodeValue is the ValueDecoder for slice types.
-func (sc *SliceCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Kind() != reflect.Slice {
- return ValueDecoderError{Name: "SliceDecodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val}
- }
-
- switch vrType := vr.Type(); vrType {
- case bsontype.Array:
- case bsontype.Null:
- val.Set(reflect.Zero(val.Type()))
- return vr.ReadNull()
- case bsontype.Undefined:
- val.Set(reflect.Zero(val.Type()))
- return vr.ReadUndefined()
- case bsontype.Type(0), bsontype.EmbeddedDocument:
- if val.Type().Elem() != tE {
- return fmt.Errorf("cannot decode document into %s", val.Type())
- }
- case bsontype.Binary:
- if val.Type().Elem() != tByte {
- return fmt.Errorf("SliceDecodeValue can only decode a binary into a byte array, got %v", vrType)
- }
- data, subtype, err := vr.ReadBinary()
- if err != nil {
- return err
- }
- if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld {
- return fmt.Errorf("SliceDecodeValue can only be used to decode subtype 0x00 or 0x02 for %s, got %v", bsontype.Binary, subtype)
- }
-
- if val.IsNil() {
- val.Set(reflect.MakeSlice(val.Type(), 0, len(data)))
- }
- val.SetLen(0)
- val.Set(reflect.AppendSlice(val, reflect.ValueOf(data)))
- return nil
- case bsontype.String:
- if sliceType := val.Type().Elem(); sliceType != tByte {
- return fmt.Errorf("SliceDecodeValue can only decode a string into a byte array, got %v", sliceType)
- }
- str, err := vr.ReadString()
- if err != nil {
- return err
- }
- byteStr := []byte(str)
-
- if val.IsNil() {
- val.Set(reflect.MakeSlice(val.Type(), 0, len(byteStr)))
- }
- val.SetLen(0)
- val.Set(reflect.AppendSlice(val, reflect.ValueOf(byteStr)))
- return nil
- default:
- return fmt.Errorf("cannot decode %v into a slice", vrType)
- }
-
- var elemsFunc func(DecodeContext, bsonrw.ValueReader, reflect.Value) ([]reflect.Value, error)
- switch val.Type().Elem() {
- case tE:
- dc.Ancestor = val.Type()
- elemsFunc = defaultValueDecoders.decodeD
- default:
- elemsFunc = defaultValueDecoders.decodeDefault
- }
-
- elems, err := elemsFunc(dc, vr, val)
- if err != nil {
- return err
- }
-
- if val.IsNil() {
- val.Set(reflect.MakeSlice(val.Type(), 0, len(elems)))
- }
-
- val.SetLen(0)
- val.Set(reflect.Append(val, elems...))
-
- return nil
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/string_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/string_codec.go
deleted file mode 100644
index a8f885a85..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/string_codec.go
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "fmt"
- "reflect"
-
- "go.mongodb.org/mongo-driver/bson/bsonoptions"
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
-)
-
-// StringCodec is the Codec used for string values.
-//
-// Deprecated: StringCodec will not be directly accessible in Go Driver 2.0. To
-// override the default string encode and decode behavior, create a new registry
-// with [go.mongodb.org/mongo-driver/bson.NewRegistry] and register a new
-// encoder and decoder for strings.
-//
-// For example,
-//
-// reg := bson.NewRegistry()
-// reg.RegisterKindEncoder(reflect.String, myStringEncoder)
-// reg.RegisterKindDecoder(reflect.String, myStringDecoder)
-type StringCodec struct {
- // DecodeObjectIDAsHex specifies if object IDs should be decoded as their hex representation.
- // If false, a string made from the raw object ID bytes will be used. Defaults to true.
- //
- // Deprecated: Decoding object IDs as raw bytes will not be supported in Go Driver 2.0.
- DecodeObjectIDAsHex bool
-}
-
-var (
- defaultStringCodec = NewStringCodec()
-
- // Assert that defaultStringCodec satisfies the typeDecoder interface, which allows it to be
- // used by collection type decoders (e.g. map, slice, etc) to set individual values in a
- // collection.
- _ typeDecoder = defaultStringCodec
-)
-
-// NewStringCodec returns a StringCodec with options opts.
-//
-// Deprecated: NewStringCodec will not be available in Go Driver 2.0. See
-// [StringCodec] for more details.
-func NewStringCodec(opts ...*bsonoptions.StringCodecOptions) *StringCodec {
- stringOpt := bsonoptions.MergeStringCodecOptions(opts...)
- return &StringCodec{*stringOpt.DecodeObjectIDAsHex}
-}
-
-// EncodeValue is the ValueEncoder for string types.
-func (sc *StringCodec) EncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if val.Kind() != reflect.String {
- return ValueEncoderError{
- Name: "StringEncodeValue",
- Kinds: []reflect.Kind{reflect.String},
- Received: val,
- }
- }
-
- return vw.WriteString(val.String())
-}
-
-func (sc *StringCodec) decodeType(_ DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t.Kind() != reflect.String {
- return emptyValue, ValueDecoderError{
- Name: "StringDecodeValue",
- Kinds: []reflect.Kind{reflect.String},
- Received: reflect.Zero(t),
- }
- }
-
- var str string
- var err error
- switch vr.Type() {
- case bsontype.String:
- str, err = vr.ReadString()
- if err != nil {
- return emptyValue, err
- }
- case bsontype.ObjectID:
- oid, err := vr.ReadObjectID()
- if err != nil {
- return emptyValue, err
- }
- if sc.DecodeObjectIDAsHex {
- str = oid.Hex()
- } else {
- // TODO(GODRIVER-2796): Return an error here instead of decoding to a garbled string.
- byteArray := [12]byte(oid)
- str = string(byteArray[:])
- }
- case bsontype.Symbol:
- str, err = vr.ReadSymbol()
- if err != nil {
- return emptyValue, err
- }
- case bsontype.Binary:
- data, subtype, err := vr.ReadBinary()
- if err != nil {
- return emptyValue, err
- }
- if subtype != bsontype.BinaryGeneric && subtype != bsontype.BinaryBinaryOld {
- return emptyValue, decodeBinaryError{subtype: subtype, typeName: "string"}
- }
- str = string(data)
- case bsontype.Null:
- if err = vr.ReadNull(); err != nil {
- return emptyValue, err
- }
- case bsontype.Undefined:
- if err = vr.ReadUndefined(); err != nil {
- return emptyValue, err
- }
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a string type", vr.Type())
- }
-
- return reflect.ValueOf(str), nil
-}
-
-// DecodeValue is the ValueDecoder for string types.
-func (sc *StringCodec) DecodeValue(dctx DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Kind() != reflect.String {
- return ValueDecoderError{Name: "StringDecodeValue", Kinds: []reflect.Kind{reflect.String}, Received: val}
- }
-
- elem, err := sc.decodeType(dctx, vr, val.Type())
- if err != nil {
- return err
- }
-
- val.SetString(elem.String())
- return nil
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go
deleted file mode 100644
index f8d9690c1..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_codec.go
+++ /dev/null
@@ -1,736 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "errors"
- "fmt"
- "reflect"
- "sort"
- "strings"
- "sync"
- "time"
-
- "go.mongodb.org/mongo-driver/bson/bsonoptions"
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
-)
-
-// DecodeError represents an error that occurs when unmarshalling BSON bytes into a native Go type.
-type DecodeError struct {
- keys []string
- wrapped error
-}
-
-// Unwrap returns the underlying error
-func (de *DecodeError) Unwrap() error {
- return de.wrapped
-}
-
-// Error implements the error interface.
-func (de *DecodeError) Error() string {
- // The keys are stored in reverse order because the de.keys slice is builtup while propagating the error up the
- // stack of BSON keys, so we call de.Keys(), which reverses them.
- keyPath := strings.Join(de.Keys(), ".")
- return fmt.Sprintf("error decoding key %s: %v", keyPath, de.wrapped)
-}
-
-// Keys returns the BSON key path that caused an error as a slice of strings. The keys in the slice are in top-down
-// order. For example, if the document being unmarshalled was {a: {b: {c: 1}}} and the value for c was supposed to be
-// a string, the keys slice will be ["a", "b", "c"].
-func (de *DecodeError) Keys() []string {
- reversedKeys := make([]string, 0, len(de.keys))
- for idx := len(de.keys) - 1; idx >= 0; idx-- {
- reversedKeys = append(reversedKeys, de.keys[idx])
- }
-
- return reversedKeys
-}
-
-// Zeroer allows custom struct types to implement a report of zero
-// state. All struct types that don't implement Zeroer or where IsZero
-// returns false are considered to be not zero.
-type Zeroer interface {
- IsZero() bool
-}
-
-// StructCodec is the Codec used for struct values.
-//
-// Deprecated: StructCodec will not be directly configurable in Go Driver 2.0.
-// To configure the struct encode and decode behavior, use the configuration
-// methods on a [go.mongodb.org/mongo-driver/bson.Encoder] or
-// [go.mongodb.org/mongo-driver/bson.Decoder]. To configure the struct encode
-// and decode behavior for a mongo.Client, use
-// [go.mongodb.org/mongo-driver/mongo/options.ClientOptions.SetBSONOptions].
-//
-// For example, to configure a mongo.Client to omit zero-value structs when
-// using the "omitempty" struct tag, use:
-//
-// opt := options.Client().SetBSONOptions(&options.BSONOptions{
-// OmitZeroStruct: true,
-// })
-//
-// See the deprecation notice for each field in StructCodec for the corresponding
-// settings.
-type StructCodec struct {
- cache sync.Map // map[reflect.Type]*structDescription
- parser StructTagParser
-
- // DecodeZeroStruct causes DecodeValue to delete any existing values from Go structs in the
- // destination value passed to Decode before unmarshaling BSON documents into them.
- //
- // Deprecated: Use bson.Decoder.ZeroStructs or options.BSONOptions.ZeroStructs instead.
- DecodeZeroStruct bool
-
- // DecodeDeepZeroInline causes DecodeValue to delete any existing values from Go structs in the
- // destination value passed to Decode before unmarshaling BSON documents into them.
- //
- // Deprecated: DecodeDeepZeroInline will not be supported in Go Driver 2.0.
- DecodeDeepZeroInline bool
-
- // EncodeOmitDefaultStruct causes the Encoder to consider the zero value for a struct (e.g.
- // MyStruct{}) as empty and omit it from the marshaled BSON when the "omitempty" struct tag
- // option is set.
- //
- // Deprecated: Use bson.Encoder.OmitZeroStruct or options.BSONOptions.OmitZeroStruct instead.
- EncodeOmitDefaultStruct bool
-
- // AllowUnexportedFields allows encoding and decoding values from un-exported struct fields.
- //
- // Deprecated: AllowUnexportedFields does not work on recent versions of Go and will not be
- // supported in Go Driver 2.0.
- AllowUnexportedFields bool
-
- // OverwriteDuplicatedInlinedFields, if false, causes EncodeValue to return an error if there is
- // a duplicate field in the marshaled BSON when the "inline" struct tag option is set. The
- // default value is true.
- //
- // Deprecated: Use bson.Encoder.ErrorOnInlineDuplicates or
- // options.BSONOptions.ErrorOnInlineDuplicates instead.
- OverwriteDuplicatedInlinedFields bool
-}
-
-var _ ValueEncoder = &StructCodec{}
-var _ ValueDecoder = &StructCodec{}
-
-// NewStructCodec returns a StructCodec that uses p for struct tag parsing.
-//
-// Deprecated: NewStructCodec will not be available in Go Driver 2.0. See
-// [StructCodec] for more details.
-func NewStructCodec(p StructTagParser, opts ...*bsonoptions.StructCodecOptions) (*StructCodec, error) {
- if p == nil {
- return nil, errors.New("a StructTagParser must be provided to NewStructCodec")
- }
-
- structOpt := bsonoptions.MergeStructCodecOptions(opts...)
-
- codec := &StructCodec{
- parser: p,
- }
-
- if structOpt.DecodeZeroStruct != nil {
- codec.DecodeZeroStruct = *structOpt.DecodeZeroStruct
- }
- if structOpt.DecodeDeepZeroInline != nil {
- codec.DecodeDeepZeroInline = *structOpt.DecodeDeepZeroInline
- }
- if structOpt.EncodeOmitDefaultStruct != nil {
- codec.EncodeOmitDefaultStruct = *structOpt.EncodeOmitDefaultStruct
- }
- if structOpt.OverwriteDuplicatedInlinedFields != nil {
- codec.OverwriteDuplicatedInlinedFields = *structOpt.OverwriteDuplicatedInlinedFields
- }
- if structOpt.AllowUnexportedFields != nil {
- codec.AllowUnexportedFields = *structOpt.AllowUnexportedFields
- }
-
- return codec, nil
-}
-
-// EncodeValue handles encoding generic struct types.
-func (sc *StructCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Kind() != reflect.Struct {
- return ValueEncoderError{Name: "StructCodec.EncodeValue", Kinds: []reflect.Kind{reflect.Struct}, Received: val}
- }
-
- sd, err := sc.describeStruct(ec.Registry, val.Type(), ec.useJSONStructTags, ec.errorOnInlineDuplicates)
- if err != nil {
- return err
- }
-
- dw, err := vw.WriteDocument()
- if err != nil {
- return err
- }
- var rv reflect.Value
- for _, desc := range sd.fl {
- if desc.inline == nil {
- rv = val.Field(desc.idx)
- } else {
- rv, err = fieldByIndexErr(val, desc.inline)
- if err != nil {
- continue
- }
- }
-
- desc.encoder, rv, err = defaultValueEncoders.lookupElementEncoder(ec, desc.encoder, rv)
-
- if err != nil && !errors.Is(err, errInvalidValue) {
- return err
- }
-
- if errors.Is(err, errInvalidValue) {
- if desc.omitEmpty {
- continue
- }
- vw2, err := dw.WriteDocumentElement(desc.name)
- if err != nil {
- return err
- }
- err = vw2.WriteNull()
- if err != nil {
- return err
- }
- continue
- }
-
- if desc.encoder == nil {
- return ErrNoEncoder{Type: rv.Type()}
- }
-
- encoder := desc.encoder
-
- var empty bool
- if cz, ok := encoder.(CodecZeroer); ok {
- empty = cz.IsTypeZero(rv.Interface())
- } else if rv.Kind() == reflect.Interface {
- // isEmpty will not treat an interface rv as an interface, so we need to check for the
- // nil interface separately.
- empty = rv.IsNil()
- } else {
- empty = isEmpty(rv, sc.EncodeOmitDefaultStruct || ec.omitZeroStruct)
- }
- if desc.omitEmpty && empty {
- continue
- }
-
- vw2, err := dw.WriteDocumentElement(desc.name)
- if err != nil {
- return err
- }
-
- ectx := EncodeContext{
- Registry: ec.Registry,
- MinSize: desc.minSize || ec.MinSize,
- errorOnInlineDuplicates: ec.errorOnInlineDuplicates,
- stringifyMapKeysWithFmt: ec.stringifyMapKeysWithFmt,
- nilMapAsEmpty: ec.nilMapAsEmpty,
- nilSliceAsEmpty: ec.nilSliceAsEmpty,
- nilByteSliceAsEmpty: ec.nilByteSliceAsEmpty,
- omitZeroStruct: ec.omitZeroStruct,
- useJSONStructTags: ec.useJSONStructTags,
- }
- err = encoder.EncodeValue(ectx, vw2, rv)
- if err != nil {
- return err
- }
- }
-
- if sd.inlineMap >= 0 {
- rv := val.Field(sd.inlineMap)
- collisionFn := func(key string) bool {
- _, exists := sd.fm[key]
- return exists
- }
-
- return defaultMapCodec.mapEncodeValue(ec, dw, rv, collisionFn)
- }
-
- return dw.WriteDocumentEnd()
-}
-
-func newDecodeError(key string, original error) error {
- var de *DecodeError
- if !errors.As(original, &de) {
- return &DecodeError{
- keys: []string{key},
- wrapped: original,
- }
- }
-
- de.keys = append(de.keys, key)
- return de
-}
-
-// DecodeValue implements the Codec interface.
-// By default, map types in val will not be cleared. If a map has existing key/value pairs, it will be extended with the new ones from vr.
-// For slices, the decoder will set the length of the slice to zero and append all elements. The underlying array will not be cleared.
-func (sc *StructCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Kind() != reflect.Struct {
- return ValueDecoderError{Name: "StructCodec.DecodeValue", Kinds: []reflect.Kind{reflect.Struct}, Received: val}
- }
-
- switch vrType := vr.Type(); vrType {
- case bsontype.Type(0), bsontype.EmbeddedDocument:
- case bsontype.Null:
- if err := vr.ReadNull(); err != nil {
- return err
- }
-
- val.Set(reflect.Zero(val.Type()))
- return nil
- case bsontype.Undefined:
- if err := vr.ReadUndefined(); err != nil {
- return err
- }
-
- val.Set(reflect.Zero(val.Type()))
- return nil
- default:
- return fmt.Errorf("cannot decode %v into a %s", vrType, val.Type())
- }
-
- sd, err := sc.describeStruct(dc.Registry, val.Type(), dc.useJSONStructTags, false)
- if err != nil {
- return err
- }
-
- if sc.DecodeZeroStruct || dc.zeroStructs {
- val.Set(reflect.Zero(val.Type()))
- }
- if sc.DecodeDeepZeroInline && sd.inline {
- val.Set(deepZero(val.Type()))
- }
-
- var decoder ValueDecoder
- var inlineMap reflect.Value
- if sd.inlineMap >= 0 {
- inlineMap = val.Field(sd.inlineMap)
- decoder, err = dc.LookupDecoder(inlineMap.Type().Elem())
- if err != nil {
- return err
- }
- }
-
- dr, err := vr.ReadDocument()
- if err != nil {
- return err
- }
-
- for {
- name, vr, err := dr.ReadElement()
- if errors.Is(err, bsonrw.ErrEOD) {
- break
- }
- if err != nil {
- return err
- }
-
- fd, exists := sd.fm[name]
- if !exists {
- // if the original name isn't found in the struct description, try again with the name in lowercase
- // this could match if a BSON tag isn't specified because by default, describeStruct lowercases all field
- // names
- fd, exists = sd.fm[strings.ToLower(name)]
- }
-
- if !exists {
- if sd.inlineMap < 0 {
- // The encoding/json package requires a flag to return on error for non-existent fields.
- // This functionality seems appropriate for the struct codec.
- err = vr.Skip()
- if err != nil {
- return err
- }
- continue
- }
-
- if inlineMap.IsNil() {
- inlineMap.Set(reflect.MakeMap(inlineMap.Type()))
- }
-
- elem := reflect.New(inlineMap.Type().Elem()).Elem()
- dc.Ancestor = inlineMap.Type()
- err = decoder.DecodeValue(dc, vr, elem)
- if err != nil {
- return err
- }
- inlineMap.SetMapIndex(reflect.ValueOf(name), elem)
- continue
- }
-
- var field reflect.Value
- if fd.inline == nil {
- field = val.Field(fd.idx)
- } else {
- field, err = getInlineField(val, fd.inline)
- if err != nil {
- return err
- }
- }
-
- if !field.CanSet() { // Being settable is a super set of being addressable.
- innerErr := fmt.Errorf("field %v is not settable", field)
- return newDecodeError(fd.name, innerErr)
- }
- if field.Kind() == reflect.Ptr && field.IsNil() {
- field.Set(reflect.New(field.Type().Elem()))
- }
- field = field.Addr()
-
- dctx := DecodeContext{
- Registry: dc.Registry,
- Truncate: fd.truncate || dc.Truncate,
- defaultDocumentType: dc.defaultDocumentType,
- binaryAsSlice: dc.binaryAsSlice,
- useJSONStructTags: dc.useJSONStructTags,
- useLocalTimeZone: dc.useLocalTimeZone,
- zeroMaps: dc.zeroMaps,
- zeroStructs: dc.zeroStructs,
- }
-
- if fd.decoder == nil {
- return newDecodeError(fd.name, ErrNoDecoder{Type: field.Elem().Type()})
- }
-
- err = fd.decoder.DecodeValue(dctx, vr, field.Elem())
- if err != nil {
- return newDecodeError(fd.name, err)
- }
- }
-
- return nil
-}
-
-func isEmpty(v reflect.Value, omitZeroStruct bool) bool {
- kind := v.Kind()
- if (kind != reflect.Ptr || !v.IsNil()) && v.Type().Implements(tZeroer) {
- return v.Interface().(Zeroer).IsZero()
- }
- switch kind {
- case reflect.Array, reflect.Map, reflect.Slice, reflect.String:
- return v.Len() == 0
- case reflect.Struct:
- if !omitZeroStruct {
- return false
- }
- vt := v.Type()
- if vt == tTime {
- return v.Interface().(time.Time).IsZero()
- }
- numField := vt.NumField()
- for i := 0; i < numField; i++ {
- ff := vt.Field(i)
- if ff.PkgPath != "" && !ff.Anonymous {
- continue // Private field
- }
- if !isEmpty(v.Field(i), omitZeroStruct) {
- return false
- }
- }
- return true
- }
- return !v.IsValid() || v.IsZero()
-}
-
-type structDescription struct {
- fm map[string]fieldDescription
- fl []fieldDescription
- inlineMap int
- inline bool
-}
-
-type fieldDescription struct {
- name string // BSON key name
- fieldName string // struct field name
- idx int
- omitEmpty bool
- minSize bool
- truncate bool
- inline []int
- encoder ValueEncoder
- decoder ValueDecoder
-}
-
-type byIndex []fieldDescription
-
-func (bi byIndex) Len() int { return len(bi) }
-
-func (bi byIndex) Swap(i, j int) { bi[i], bi[j] = bi[j], bi[i] }
-
-func (bi byIndex) Less(i, j int) bool {
- // If a field is inlined, its index in the top level struct is stored at inline[0]
- iIdx, jIdx := bi[i].idx, bi[j].idx
- if len(bi[i].inline) > 0 {
- iIdx = bi[i].inline[0]
- }
- if len(bi[j].inline) > 0 {
- jIdx = bi[j].inline[0]
- }
- if iIdx != jIdx {
- return iIdx < jIdx
- }
- for k, biik := range bi[i].inline {
- if k >= len(bi[j].inline) {
- return false
- }
- if biik != bi[j].inline[k] {
- return biik < bi[j].inline[k]
- }
- }
- return len(bi[i].inline) < len(bi[j].inline)
-}
-
-func (sc *StructCodec) describeStruct(
- r *Registry,
- t reflect.Type,
- useJSONStructTags bool,
- errorOnDuplicates bool,
-) (*structDescription, error) {
- // We need to analyze the struct, including getting the tags, collecting
- // information about inlining, and create a map of the field name to the field.
- if v, ok := sc.cache.Load(t); ok {
- return v.(*structDescription), nil
- }
- // TODO(charlie): Only describe the struct once when called
- // concurrently with the same type.
- ds, err := sc.describeStructSlow(r, t, useJSONStructTags, errorOnDuplicates)
- if err != nil {
- return nil, err
- }
- if v, loaded := sc.cache.LoadOrStore(t, ds); loaded {
- ds = v.(*structDescription)
- }
- return ds, nil
-}
-
-func (sc *StructCodec) describeStructSlow(
- r *Registry,
- t reflect.Type,
- useJSONStructTags bool,
- errorOnDuplicates bool,
-) (*structDescription, error) {
- numFields := t.NumField()
- sd := &structDescription{
- fm: make(map[string]fieldDescription, numFields),
- fl: make([]fieldDescription, 0, numFields),
- inlineMap: -1,
- }
-
- var fields []fieldDescription
- for i := 0; i < numFields; i++ {
- sf := t.Field(i)
- if sf.PkgPath != "" && (!sc.AllowUnexportedFields || !sf.Anonymous) {
- // field is private or unexported fields aren't allowed, ignore
- continue
- }
-
- sfType := sf.Type
- encoder, err := r.LookupEncoder(sfType)
- if err != nil {
- encoder = nil
- }
- decoder, err := r.LookupDecoder(sfType)
- if err != nil {
- decoder = nil
- }
-
- description := fieldDescription{
- fieldName: sf.Name,
- idx: i,
- encoder: encoder,
- decoder: decoder,
- }
-
- var stags StructTags
- // If the caller requested that we use JSON struct tags, use the JSONFallbackStructTagParser
- // instead of the parser defined on the codec.
- if useJSONStructTags {
- stags, err = JSONFallbackStructTagParser.ParseStructTags(sf)
- } else {
- stags, err = sc.parser.ParseStructTags(sf)
- }
- if err != nil {
- return nil, err
- }
- if stags.Skip {
- continue
- }
- description.name = stags.Name
- description.omitEmpty = stags.OmitEmpty
- description.minSize = stags.MinSize
- description.truncate = stags.Truncate
-
- if stags.Inline {
- sd.inline = true
- switch sfType.Kind() {
- case reflect.Map:
- if sd.inlineMap >= 0 {
- return nil, errors.New("(struct " + t.String() + ") multiple inline maps")
- }
- if sfType.Key() != tString {
- return nil, errors.New("(struct " + t.String() + ") inline map must have a string keys")
- }
- sd.inlineMap = description.idx
- case reflect.Ptr:
- sfType = sfType.Elem()
- if sfType.Kind() != reflect.Struct {
- return nil, fmt.Errorf("(struct %s) inline fields must be a struct, a struct pointer, or a map", t.String())
- }
- fallthrough
- case reflect.Struct:
- inlinesf, err := sc.describeStruct(r, sfType, useJSONStructTags, errorOnDuplicates)
- if err != nil {
- return nil, err
- }
- for _, fd := range inlinesf.fl {
- if fd.inline == nil {
- fd.inline = []int{i, fd.idx}
- } else {
- fd.inline = append([]int{i}, fd.inline...)
- }
- fields = append(fields, fd)
-
- }
- default:
- return nil, fmt.Errorf("(struct %s) inline fields must be a struct, a struct pointer, or a map", t.String())
- }
- continue
- }
- fields = append(fields, description)
- }
-
- // Sort fieldDescriptions by name and use dominance rules to determine which should be added for each name
- sort.Slice(fields, func(i, j int) bool {
- x := fields
- // sort field by name, breaking ties with depth, then
- // breaking ties with index sequence.
- if x[i].name != x[j].name {
- return x[i].name < x[j].name
- }
- if len(x[i].inline) != len(x[j].inline) {
- return len(x[i].inline) < len(x[j].inline)
- }
- return byIndex(x).Less(i, j)
- })
-
- for advance, i := 0, 0; i < len(fields); i += advance {
- // One iteration per name.
- // Find the sequence of fields with the name of this first field.
- fi := fields[i]
- name := fi.name
- for advance = 1; i+advance < len(fields); advance++ {
- fj := fields[i+advance]
- if fj.name != name {
- break
- }
- }
- if advance == 1 { // Only one field with this name
- sd.fl = append(sd.fl, fi)
- sd.fm[name] = fi
- continue
- }
- dominant, ok := dominantField(fields[i : i+advance])
- if !ok || !sc.OverwriteDuplicatedInlinedFields || errorOnDuplicates {
- return nil, fmt.Errorf("struct %s has duplicated key %s", t.String(), name)
- }
- sd.fl = append(sd.fl, dominant)
- sd.fm[name] = dominant
- }
-
- sort.Sort(byIndex(sd.fl))
-
- return sd, nil
-}
-
-// dominantField looks through the fields, all of which are known to
-// have the same name, to find the single field that dominates the
-// others using Go's inlining rules. If there are multiple top-level
-// fields, the boolean will be false: This condition is an error in Go
-// and we skip all the fields.
-func dominantField(fields []fieldDescription) (fieldDescription, bool) {
- // The fields are sorted in increasing index-length order, then by presence of tag.
- // That means that the first field is the dominant one. We need only check
- // for error cases: two fields at top level.
- if len(fields) > 1 &&
- len(fields[0].inline) == len(fields[1].inline) {
- return fieldDescription{}, false
- }
- return fields[0], true
-}
-
-func fieldByIndexErr(v reflect.Value, index []int) (result reflect.Value, err error) {
- defer func() {
- if recovered := recover(); recovered != nil {
- switch r := recovered.(type) {
- case string:
- err = fmt.Errorf("%s", r)
- case error:
- err = r
- }
- }
- }()
-
- result = v.FieldByIndex(index)
- return
-}
-
-func getInlineField(val reflect.Value, index []int) (reflect.Value, error) {
- field, err := fieldByIndexErr(val, index)
- if err == nil {
- return field, nil
- }
-
- // if parent of this element doesn't exist, fix its parent
- inlineParent := index[:len(index)-1]
- var fParent reflect.Value
- if fParent, err = fieldByIndexErr(val, inlineParent); err != nil {
- fParent, err = getInlineField(val, inlineParent)
- if err != nil {
- return fParent, err
- }
- }
- fParent.Set(reflect.New(fParent.Type().Elem()))
-
- return fieldByIndexErr(val, index)
-}
-
-// DeepZero returns recursive zero object
-func deepZero(st reflect.Type) (result reflect.Value) {
- if st.Kind() == reflect.Struct {
- numField := st.NumField()
- for i := 0; i < numField; i++ {
- if result == emptyValue {
- result = reflect.Indirect(reflect.New(st))
- }
- f := result.Field(i)
- if f.CanInterface() {
- if f.Type().Kind() == reflect.Struct {
- result.Field(i).Set(recursivePointerTo(deepZero(f.Type().Elem())))
- }
- }
- }
- }
- return result
-}
-
-// recursivePointerTo calls reflect.New(v.Type) but recursively for its fields inside
-func recursivePointerTo(v reflect.Value) reflect.Value {
- v = reflect.Indirect(v)
- result := reflect.New(v.Type())
- if v.Kind() == reflect.Struct {
- for i := 0; i < v.NumField(); i++ {
- if f := v.Field(i); f.Kind() == reflect.Ptr {
- if f.Elem().Kind() == reflect.Struct {
- result.Elem().Field(i).Set(recursivePointerTo(f))
- }
- }
- }
- }
-
- return result
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_tag_parser.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_tag_parser.go
deleted file mode 100644
index 18d85bfb0..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/struct_tag_parser.go
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "reflect"
- "strings"
-)
-
-// StructTagParser returns the struct tags for a given struct field.
-//
-// Deprecated: Defining custom BSON struct tag parsers will not be supported in Go Driver 2.0.
-type StructTagParser interface {
- ParseStructTags(reflect.StructField) (StructTags, error)
-}
-
-// StructTagParserFunc is an adapter that allows a generic function to be used
-// as a StructTagParser.
-//
-// Deprecated: Defining custom BSON struct tag parsers will not be supported in Go Driver 2.0.
-type StructTagParserFunc func(reflect.StructField) (StructTags, error)
-
-// ParseStructTags implements the StructTagParser interface.
-func (stpf StructTagParserFunc) ParseStructTags(sf reflect.StructField) (StructTags, error) {
- return stpf(sf)
-}
-
-// StructTags represents the struct tag fields that the StructCodec uses during
-// the encoding and decoding process.
-//
-// In the case of a struct, the lowercased field name is used as the key for each exported
-// field but this behavior may be changed using a struct tag. The tag may also contain flags to
-// adjust the marshalling behavior for the field.
-//
-// The properties are defined below:
-//
-// OmitEmpty Only include the field if it's not set to the zero value for the type or to
-// empty slices or maps.
-//
-// MinSize Marshal an integer of a type larger than 32 bits value as an int32, if that's
-// feasible while preserving the numeric value.
-//
-// Truncate When unmarshaling a BSON double, it is permitted to lose precision to fit within
-// a float32.
-//
-// Inline Inline the field, which must be a struct or a map, causing all of its fields
-// or keys to be processed as if they were part of the outer struct. For maps,
-// keys must not conflict with the bson keys of other struct fields.
-//
-// Skip This struct field should be skipped. This is usually denoted by parsing a "-"
-// for the name.
-//
-// Deprecated: Defining custom BSON struct tag parsers will not be supported in Go Driver 2.0.
-type StructTags struct {
- Name string
- OmitEmpty bool
- MinSize bool
- Truncate bool
- Inline bool
- Skip bool
-}
-
-// DefaultStructTagParser is the StructTagParser used by the StructCodec by default.
-// It will handle the bson struct tag. See the documentation for StructTags to see
-// what each of the returned fields means.
-//
-// If there is no name in the struct tag fields, the struct field name is lowercased.
-// The tag formats accepted are:
-//
-// "[<key>][,<flag1>[,<flag2>]]"
-//
-// `(...) bson:"[<key>][,<flag1>[,<flag2>]]" (...)`
-//
-// An example:
-//
-// type T struct {
-// A bool
-// B int "myb"
-// C string "myc,omitempty"
-// D string `bson:",omitempty" json:"jsonkey"`
-// E int64 ",minsize"
-// F int64 "myf,omitempty,minsize"
-// }
-//
-// A struct tag either consisting entirely of '-' or with a bson key with a
-// value consisting entirely of '-' will return a StructTags with Skip true and
-// the remaining fields will be their default values.
-//
-// Deprecated: DefaultStructTagParser will be removed in Go Driver 2.0.
-var DefaultStructTagParser StructTagParserFunc = func(sf reflect.StructField) (StructTags, error) {
- key := strings.ToLower(sf.Name)
- tag, ok := sf.Tag.Lookup("bson")
- if !ok && !strings.Contains(string(sf.Tag), ":") && len(sf.Tag) > 0 {
- tag = string(sf.Tag)
- }
- return parseTags(key, tag)
-}
-
-func parseTags(key string, tag string) (StructTags, error) {
- var st StructTags
- if tag == "-" {
- st.Skip = true
- return st, nil
- }
-
- for idx, str := range strings.Split(tag, ",") {
- if idx == 0 && str != "" {
- key = str
- }
- switch str {
- case "omitempty":
- st.OmitEmpty = true
- case "minsize":
- st.MinSize = true
- case "truncate":
- st.Truncate = true
- case "inline":
- st.Inline = true
- }
- }
-
- st.Name = key
-
- return st, nil
-}
-
-// JSONFallbackStructTagParser has the same behavior as DefaultStructTagParser
-// but will also fallback to parsing the json tag instead on a field where the
-// bson tag isn't available.
-//
-// Deprecated: Use [go.mongodb.org/mongo-driver/bson.Encoder.UseJSONStructTags] and
-// [go.mongodb.org/mongo-driver/bson.Decoder.UseJSONStructTags] instead.
-var JSONFallbackStructTagParser StructTagParserFunc = func(sf reflect.StructField) (StructTags, error) {
- key := strings.ToLower(sf.Name)
- tag, ok := sf.Tag.Lookup("bson")
- if !ok {
- tag, ok = sf.Tag.Lookup("json")
- }
- if !ok && !strings.Contains(string(sf.Tag), ":") && len(sf.Tag) > 0 {
- tag = string(sf.Tag)
- }
-
- return parseTags(key, tag)
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/time_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/time_codec.go
deleted file mode 100644
index 22fb762c4..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/time_codec.go
+++ /dev/null
@@ -1,151 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "fmt"
- "reflect"
- "time"
-
- "go.mongodb.org/mongo-driver/bson/bsonoptions"
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
- "go.mongodb.org/mongo-driver/bson/primitive"
-)
-
-const (
- timeFormatString = "2006-01-02T15:04:05.999Z07:00"
-)
-
-// TimeCodec is the Codec used for time.Time values.
-//
-// Deprecated: TimeCodec will not be directly configurable in Go Driver 2.0.
-// To configure the time.Time encode and decode behavior, use the configuration
-// methods on a [go.mongodb.org/mongo-driver/bson.Encoder] or
-// [go.mongodb.org/mongo-driver/bson.Decoder]. To configure the time.Time encode
-// and decode behavior for a mongo.Client, use
-// [go.mongodb.org/mongo-driver/mongo/options.ClientOptions.SetBSONOptions].
-//
-// For example, to configure a mongo.Client to ..., use:
-//
-// opt := options.Client().SetBSONOptions(&options.BSONOptions{
-// UseLocalTimeZone: true,
-// })
-//
-// See the deprecation notice for each field in TimeCodec for the corresponding
-// settings.
-type TimeCodec struct {
- // UseLocalTimeZone specifies if we should decode into the local time zone. Defaults to false.
- //
- // Deprecated: Use bson.Decoder.UseLocalTimeZone or options.BSONOptions.UseLocalTimeZone
- // instead.
- UseLocalTimeZone bool
-}
-
-var (
- defaultTimeCodec = NewTimeCodec()
-
- // Assert that defaultTimeCodec satisfies the typeDecoder interface, which allows it to be used
- // by collection type decoders (e.g. map, slice, etc) to set individual values in a collection.
- _ typeDecoder = defaultTimeCodec
-)
-
-// NewTimeCodec returns a TimeCodec with options opts.
-//
-// Deprecated: NewTimeCodec will not be available in Go Driver 2.0. See
-// [TimeCodec] for more details.
-func NewTimeCodec(opts ...*bsonoptions.TimeCodecOptions) *TimeCodec {
- timeOpt := bsonoptions.MergeTimeCodecOptions(opts...)
-
- codec := TimeCodec{}
- if timeOpt.UseLocalTimeZone != nil {
- codec.UseLocalTimeZone = *timeOpt.UseLocalTimeZone
- }
- return &codec
-}
-
-func (tc *TimeCodec) decodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- if t != tTime {
- return emptyValue, ValueDecoderError{
- Name: "TimeDecodeValue",
- Types: []reflect.Type{tTime},
- Received: reflect.Zero(t),
- }
- }
-
- var timeVal time.Time
- switch vrType := vr.Type(); vrType {
- case bsontype.DateTime:
- dt, err := vr.ReadDateTime()
- if err != nil {
- return emptyValue, err
- }
- timeVal = time.Unix(dt/1000, dt%1000*1000000)
- case bsontype.String:
- // assume strings are in the isoTimeFormat
- timeStr, err := vr.ReadString()
- if err != nil {
- return emptyValue, err
- }
- timeVal, err = time.Parse(timeFormatString, timeStr)
- if err != nil {
- return emptyValue, err
- }
- case bsontype.Int64:
- i64, err := vr.ReadInt64()
- if err != nil {
- return emptyValue, err
- }
- timeVal = time.Unix(i64/1000, i64%1000*1000000)
- case bsontype.Timestamp:
- t, _, err := vr.ReadTimestamp()
- if err != nil {
- return emptyValue, err
- }
- timeVal = time.Unix(int64(t), 0)
- case bsontype.Null:
- if err := vr.ReadNull(); err != nil {
- return emptyValue, err
- }
- case bsontype.Undefined:
- if err := vr.ReadUndefined(); err != nil {
- return emptyValue, err
- }
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into a time.Time", vrType)
- }
-
- if !tc.UseLocalTimeZone && !dc.useLocalTimeZone {
- timeVal = timeVal.UTC()
- }
- return reflect.ValueOf(timeVal), nil
-}
-
-// DecodeValue is the ValueDecoderFunc for time.Time.
-func (tc *TimeCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() || val.Type() != tTime {
- return ValueDecoderError{Name: "TimeDecodeValue", Types: []reflect.Type{tTime}, Received: val}
- }
-
- elem, err := tc.decodeType(dc, vr, tTime)
- if err != nil {
- return err
- }
-
- val.Set(elem)
- return nil
-}
-
-// EncodeValue is the ValueEncoderFunc for time.TIme.
-func (tc *TimeCodec) EncodeValue(_ EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- if !val.IsValid() || val.Type() != tTime {
- return ValueEncoderError{Name: "TimeEncodeValue", Types: []reflect.Type{tTime}, Received: val}
- }
- tt := val.Interface().(time.Time)
- dt := primitive.NewDateTimeFromTime(tt)
- return vw.WriteDateTime(int64(dt))
-}
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go
deleted file mode 100644
index 6ade17b7d..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/types.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "encoding/json"
- "net/url"
- "reflect"
- "time"
-
- "go.mongodb.org/mongo-driver/bson/primitive"
- "go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
-)
-
-var tBool = reflect.TypeOf(false)
-var tFloat64 = reflect.TypeOf(float64(0))
-var tInt32 = reflect.TypeOf(int32(0))
-var tInt64 = reflect.TypeOf(int64(0))
-var tString = reflect.TypeOf("")
-var tTime = reflect.TypeOf(time.Time{})
-
-var tEmpty = reflect.TypeOf((*interface{})(nil)).Elem()
-var tByteSlice = reflect.TypeOf([]byte(nil))
-var tByte = reflect.TypeOf(byte(0x00))
-var tURL = reflect.TypeOf(url.URL{})
-var tJSONNumber = reflect.TypeOf(json.Number(""))
-
-var tValueMarshaler = reflect.TypeOf((*ValueMarshaler)(nil)).Elem()
-var tValueUnmarshaler = reflect.TypeOf((*ValueUnmarshaler)(nil)).Elem()
-var tMarshaler = reflect.TypeOf((*Marshaler)(nil)).Elem()
-var tUnmarshaler = reflect.TypeOf((*Unmarshaler)(nil)).Elem()
-var tProxy = reflect.TypeOf((*Proxy)(nil)).Elem()
-var tZeroer = reflect.TypeOf((*Zeroer)(nil)).Elem()
-
-var tBinary = reflect.TypeOf(primitive.Binary{})
-var tUndefined = reflect.TypeOf(primitive.Undefined{})
-var tOID = reflect.TypeOf(primitive.ObjectID{})
-var tDateTime = reflect.TypeOf(primitive.DateTime(0))
-var tNull = reflect.TypeOf(primitive.Null{})
-var tRegex = reflect.TypeOf(primitive.Regex{})
-var tCodeWithScope = reflect.TypeOf(primitive.CodeWithScope{})
-var tDBPointer = reflect.TypeOf(primitive.DBPointer{})
-var tJavaScript = reflect.TypeOf(primitive.JavaScript(""))
-var tSymbol = reflect.TypeOf(primitive.Symbol(""))
-var tTimestamp = reflect.TypeOf(primitive.Timestamp{})
-var tDecimal = reflect.TypeOf(primitive.Decimal128{})
-var tMinKey = reflect.TypeOf(primitive.MinKey{})
-var tMaxKey = reflect.TypeOf(primitive.MaxKey{})
-var tD = reflect.TypeOf(primitive.D{})
-var tA = reflect.TypeOf(primitive.A{})
-var tE = reflect.TypeOf(primitive.E{})
-
-var tCoreDocument = reflect.TypeOf(bsoncore.Document{})
-var tCoreArray = reflect.TypeOf(bsoncore.Array{})
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/uint_codec.go b/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/uint_codec.go
deleted file mode 100644
index 852547276..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/bsoncodec/uint_codec.go
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright (C) MongoDB, Inc. 2017-present.
-//
-// Licensed under the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License. You may obtain
-// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
-
-package bsoncodec
-
-import (
- "fmt"
- "math"
- "reflect"
-
- "go.mongodb.org/mongo-driver/bson/bsonoptions"
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
-)
-
-// UIntCodec is the Codec used for uint values.
-//
-// Deprecated: UIntCodec will not be directly configurable in Go Driver 2.0. To
-// configure the uint encode and decode behavior, use the configuration methods
-// on a [go.mongodb.org/mongo-driver/bson.Encoder] or
-// [go.mongodb.org/mongo-driver/bson.Decoder]. To configure the uint encode and
-// decode behavior for a mongo.Client, use
-// [go.mongodb.org/mongo-driver/mongo/options.ClientOptions.SetBSONOptions].
-//
-// For example, to configure a mongo.Client to marshal Go uint values as the
-// minimum BSON int size that can represent the value, use:
-//
-// opt := options.Client().SetBSONOptions(&options.BSONOptions{
-// IntMinSize: true,
-// })
-//
-// See the deprecation notice for each field in UIntCodec for the corresponding
-// settings.
-type UIntCodec struct {
- // EncodeToMinSize causes EncodeValue to marshal Go uint values (excluding uint64) as the
- // minimum BSON int size (either 32-bit or 64-bit) that can represent the integer value.
- //
- // Deprecated: Use bson.Encoder.IntMinSize or options.BSONOptions.IntMinSize instead.
- EncodeToMinSize bool
-}
-
-var (
- defaultUIntCodec = NewUIntCodec()
-
- // Assert that defaultUIntCodec satisfies the typeDecoder interface, which allows it to be used
- // by collection type decoders (e.g. map, slice, etc) to set individual values in a collection.
- _ typeDecoder = defaultUIntCodec
-)
-
-// NewUIntCodec returns a UIntCodec with options opts.
-//
-// Deprecated: NewUIntCodec will not be available in Go Driver 2.0. See
-// [UIntCodec] for more details.
-func NewUIntCodec(opts ...*bsonoptions.UIntCodecOptions) *UIntCodec {
- uintOpt := bsonoptions.MergeUIntCodecOptions(opts...)
-
- codec := UIntCodec{}
- if uintOpt.EncodeToMinSize != nil {
- codec.EncodeToMinSize = *uintOpt.EncodeToMinSize
- }
- return &codec
-}
-
-// EncodeValue is the ValueEncoder for uint types.
-func (uic *UIntCodec) EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
- switch val.Kind() {
- case reflect.Uint8, reflect.Uint16:
- return vw.WriteInt32(int32(val.Uint()))
- case reflect.Uint, reflect.Uint32, reflect.Uint64:
- u64 := val.Uint()
-
- // If ec.MinSize or if encodeToMinSize is true for a non-uint64 value we should write val as an int32
- useMinSize := ec.MinSize || (uic.EncodeToMinSize && val.Kind() != reflect.Uint64)
-
- if u64 <= math.MaxInt32 && useMinSize {
- return vw.WriteInt32(int32(u64))
- }
- if u64 > math.MaxInt64 {
- return fmt.Errorf("%d overflows int64", u64)
- }
- return vw.WriteInt64(int64(u64))
- }
-
- return ValueEncoderError{
- Name: "UintEncodeValue",
- Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint},
- Received: val,
- }
-}
-
-func (uic *UIntCodec) decodeType(dc DecodeContext, vr bsonrw.ValueReader, t reflect.Type) (reflect.Value, error) {
- var i64 int64
- var err error
- switch vrType := vr.Type(); vrType {
- case bsontype.Int32:
- i32, err := vr.ReadInt32()
- if err != nil {
- return emptyValue, err
- }
- i64 = int64(i32)
- case bsontype.Int64:
- i64, err = vr.ReadInt64()
- if err != nil {
- return emptyValue, err
- }
- case bsontype.Double:
- f64, err := vr.ReadDouble()
- if err != nil {
- return emptyValue, err
- }
- if !dc.Truncate && math.Floor(f64) != f64 {
- return emptyValue, errCannotTruncate
- }
- if f64 > float64(math.MaxInt64) {
- return emptyValue, fmt.Errorf("%g overflows int64", f64)
- }
- i64 = int64(f64)
- case bsontype.Boolean:
- b, err := vr.ReadBoolean()
- if err != nil {
- return emptyValue, err
- }
- if b {
- i64 = 1
- }
- case bsontype.Null:
- if err = vr.ReadNull(); err != nil {
- return emptyValue, err
- }
- case bsontype.Undefined:
- if err = vr.ReadUndefined(); err != nil {
- return emptyValue, err
- }
- default:
- return emptyValue, fmt.Errorf("cannot decode %v into an integer type", vrType)
- }
-
- switch t.Kind() {
- case reflect.Uint8:
- if i64 < 0 || i64 > math.MaxUint8 {
- return emptyValue, fmt.Errorf("%d overflows uint8", i64)
- }
-
- return reflect.ValueOf(uint8(i64)), nil
- case reflect.Uint16:
- if i64 < 0 || i64 > math.MaxUint16 {
- return emptyValue, fmt.Errorf("%d overflows uint16", i64)
- }
-
- return reflect.ValueOf(uint16(i64)), nil
- case reflect.Uint32:
- if i64 < 0 || i64 > math.MaxUint32 {
- return emptyValue, fmt.Errorf("%d overflows uint32", i64)
- }
-
- return reflect.ValueOf(uint32(i64)), nil
- case reflect.Uint64:
- if i64 < 0 {
- return emptyValue, fmt.Errorf("%d overflows uint64", i64)
- }
-
- return reflect.ValueOf(uint64(i64)), nil
- case reflect.Uint:
- if i64 < 0 || int64(uint(i64)) != i64 { // Can we fit this inside of an uint
- return emptyValue, fmt.Errorf("%d overflows uint", i64)
- }
-
- return reflect.ValueOf(uint(i64)), nil
- default:
- return emptyValue, ValueDecoderError{
- Name: "UintDecodeValue",
- Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint},
- Received: reflect.Zero(t),
- }
- }
-}
-
-// DecodeValue is the ValueDecoder for uint types.
-func (uic *UIntCodec) DecodeValue(dc DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
- if !val.CanSet() {
- return ValueDecoderError{
- Name: "UintDecodeValue",
- Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint},
- Received: val,
- }
- }
-
- elem, err := uic.decodeType(dc, vr, val.Type())
- if err != nil {
- return err
- }
-
- val.SetUint(elem.Uint())
- return nil
-}