summaryrefslogtreecommitdiff
path: root/vendor/go.mongodb.org/mongo-driver/bson/marshal.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/go.mongodb.org/mongo-driver/bson/marshal.go')
-rw-r--r--vendor/go.mongodb.org/mongo-driver/bson/marshal.go453
1 files changed, 0 insertions, 453 deletions
diff --git a/vendor/go.mongodb.org/mongo-driver/bson/marshal.go b/vendor/go.mongodb.org/mongo-driver/bson/marshal.go
deleted file mode 100644
index 17ce6697e..000000000
--- a/vendor/go.mongodb.org/mongo-driver/bson/marshal.go
+++ /dev/null
@@ -1,453 +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 bson
-
-import (
- "bytes"
- "encoding/json"
- "sync"
-
- "go.mongodb.org/mongo-driver/bson/bsoncodec"
- "go.mongodb.org/mongo-driver/bson/bsonrw"
- "go.mongodb.org/mongo-driver/bson/bsontype"
-)
-
-const defaultDstCap = 256
-
-var bvwPool = bsonrw.NewBSONValueWriterPool()
-var extjPool = bsonrw.NewExtJSONValueWriterPool()
-
-// Marshaler is the interface implemented by types that can marshal themselves
-// into a valid BSON document.
-//
-// Implementations of Marshaler must return a full BSON document. To create
-// custom BSON marshaling behavior for individual values in a BSON document,
-// implement the ValueMarshaler interface instead.
-type Marshaler interface {
- MarshalBSON() ([]byte, error)
-}
-
-// ValueMarshaler is the interface implemented by types that can marshal
-// themselves into a valid BSON value. The format of the returned bytes must
-// match the returned type.
-//
-// Implementations of ValueMarshaler must return an individual BSON value. To
-// create custom BSON marshaling behavior for an entire BSON document, implement
-// the Marshaler interface instead.
-type ValueMarshaler interface {
- MarshalBSONValue() (bsontype.Type, []byte, error)
-}
-
-// Marshal returns the BSON encoding of val as a BSON document. If val is not a type that can be transformed into a
-// document, MarshalValue should be used instead.
-//
-// Marshal will use the default registry created by NewRegistry to recursively
-// marshal val into a []byte. Marshal will inspect struct tags and alter the
-// marshaling process accordingly.
-func Marshal(val interface{}) ([]byte, error) {
- return MarshalWithRegistry(DefaultRegistry, val)
-}
-
-// MarshalAppend will encode val as a BSON document and append the bytes to dst. If dst is not large enough to hold the
-// bytes, it will be grown. If val is not a type that can be transformed into a document, MarshalValueAppend should be
-// used instead.
-//
-// Deprecated: Use [NewEncoder] and pass the dst byte slice (wrapped by a bytes.Buffer) into
-// [bsonrw.NewBSONValueWriter]:
-//
-// buf := bytes.NewBuffer(dst)
-// vw, err := bsonrw.NewBSONValueWriter(buf)
-// if err != nil {
-// panic(err)
-// }
-// enc, err := bson.NewEncoder(vw)
-// if err != nil {
-// panic(err)
-// }
-//
-// See [Encoder] for more examples.
-func MarshalAppend(dst []byte, val interface{}) ([]byte, error) {
- return MarshalAppendWithRegistry(DefaultRegistry, dst, val)
-}
-
-// MarshalWithRegistry returns the BSON encoding of val as a BSON document. If val is not a type that can be transformed
-// into a document, MarshalValueWithRegistry should be used instead.
-//
-// Deprecated: Use [NewEncoder] and specify the Registry by calling [Encoder.SetRegistry] instead:
-//
-// buf := new(bytes.Buffer)
-// vw, err := bsonrw.NewBSONValueWriter(buf)
-// if err != nil {
-// panic(err)
-// }
-// enc, err := bson.NewEncoder(vw)
-// if err != nil {
-// panic(err)
-// }
-// enc.SetRegistry(reg)
-//
-// See [Encoder] for more examples.
-func MarshalWithRegistry(r *bsoncodec.Registry, val interface{}) ([]byte, error) {
- dst := make([]byte, 0)
- return MarshalAppendWithRegistry(r, dst, val)
-}
-
-// MarshalWithContext returns the BSON encoding of val as a BSON document using EncodeContext ec. If val is not a type
-// that can be transformed into a document, MarshalValueWithContext should be used instead.
-//
-// Deprecated: Use [NewEncoder] and use the Encoder configuration methods to set the desired marshal
-// behavior instead:
-//
-// buf := bytes.NewBuffer(dst)
-// vw, err := bsonrw.NewBSONValueWriter(buf)
-// if err != nil {
-// panic(err)
-// }
-// enc, err := bson.NewEncoder(vw)
-// if err != nil {
-// panic(err)
-// }
-// enc.IntMinSize()
-//
-// See [Encoder] for more examples.
-func MarshalWithContext(ec bsoncodec.EncodeContext, val interface{}) ([]byte, error) {
- dst := make([]byte, 0)
- return MarshalAppendWithContext(ec, dst, val)
-}
-
-// MarshalAppendWithRegistry will encode val as a BSON document using Registry r and append the bytes to dst. If dst is
-// not large enough to hold the bytes, it will be grown. If val is not a type that can be transformed into a document,
-// MarshalValueAppendWithRegistry should be used instead.
-//
-// Deprecated: Use [NewEncoder], and pass the dst byte slice (wrapped by a bytes.Buffer) into
-// [bsonrw.NewBSONValueWriter], and specify the Registry by calling [Encoder.SetRegistry] instead:
-//
-// buf := bytes.NewBuffer(dst)
-// vw, err := bsonrw.NewBSONValueWriter(buf)
-// if err != nil {
-// panic(err)
-// }
-// enc, err := bson.NewEncoder(vw)
-// if err != nil {
-// panic(err)
-// }
-// enc.SetRegistry(reg)
-//
-// See [Encoder] for more examples.
-func MarshalAppendWithRegistry(r *bsoncodec.Registry, dst []byte, val interface{}) ([]byte, error) {
- return MarshalAppendWithContext(bsoncodec.EncodeContext{Registry: r}, dst, val)
-}
-
-// Pool of buffers for marshalling BSON.
-var bufPool = sync.Pool{
- New: func() interface{} {
- return new(bytes.Buffer)
- },
-}
-
-// MarshalAppendWithContext will encode val as a BSON document using Registry r and EncodeContext ec and append the
-// bytes to dst. If dst is not large enough to hold the bytes, it will be grown. If val is not a type that can be
-// transformed into a document, MarshalValueAppendWithContext should be used instead.
-//
-// Deprecated: Use [NewEncoder], pass the dst byte slice (wrapped by a bytes.Buffer) into
-// [bsonrw.NewBSONValueWriter], and use the Encoder configuration methods to set the desired marshal
-// behavior instead:
-//
-// buf := bytes.NewBuffer(dst)
-// vw, err := bsonrw.NewBSONValueWriter(buf)
-// if err != nil {
-// panic(err)
-// }
-// enc, err := bson.NewEncoder(vw)
-// if err != nil {
-// panic(err)
-// }
-// enc.IntMinSize()
-//
-// See [Encoder] for more examples.
-func MarshalAppendWithContext(ec bsoncodec.EncodeContext, dst []byte, val interface{}) ([]byte, error) {
- sw := bufPool.Get().(*bytes.Buffer)
- defer func() {
- // Proper usage of a sync.Pool requires each entry to have approximately
- // the same memory cost. To obtain this property when the stored type
- // contains a variably-sized buffer, we add a hard limit on the maximum
- // buffer to place back in the pool. We limit the size to 16MiB because
- // that's the maximum wire message size supported by any current MongoDB
- // server.
- //
- // Comment based on
- // https://cs.opensource.google/go/go/+/refs/tags/go1.19:src/fmt/print.go;l=147
- //
- // Recycle byte slices that are smaller than 16MiB and at least half
- // occupied.
- if sw.Cap() < 16*1024*1024 && sw.Cap()/2 < sw.Len() {
- bufPool.Put(sw)
- }
- }()
-
- sw.Reset()
- vw := bvwPool.Get(sw)
- defer bvwPool.Put(vw)
-
- enc := encPool.Get().(*Encoder)
- defer encPool.Put(enc)
-
- err := enc.Reset(vw)
- if err != nil {
- return nil, err
- }
- err = enc.SetContext(ec)
- if err != nil {
- return nil, err
- }
-
- err = enc.Encode(val)
- if err != nil {
- return nil, err
- }
-
- return append(dst, sw.Bytes()...), nil
-}
-
-// MarshalValue returns the BSON encoding of val.
-//
-// MarshalValue will use bson.DefaultRegistry to transform val into a BSON value. If val is a struct, this function will
-// inspect struct tags and alter the marshalling process accordingly.
-func MarshalValue(val interface{}) (bsontype.Type, []byte, error) {
- return MarshalValueWithRegistry(DefaultRegistry, val)
-}
-
-// MarshalValueAppend will append the BSON encoding of val to dst. If dst is not large enough to hold the BSON encoding
-// of val, dst will be grown.
-//
-// Deprecated: Appending individual BSON elements to an existing slice will not be supported in Go
-// Driver 2.0.
-func MarshalValueAppend(dst []byte, val interface{}) (bsontype.Type, []byte, error) {
- return MarshalValueAppendWithRegistry(DefaultRegistry, dst, val)
-}
-
-// MarshalValueWithRegistry returns the BSON encoding of val using Registry r.
-//
-// Deprecated: Using a custom registry to marshal individual BSON values will not be supported in Go
-// Driver 2.0.
-func MarshalValueWithRegistry(r *bsoncodec.Registry, val interface{}) (bsontype.Type, []byte, error) {
- dst := make([]byte, 0)
- return MarshalValueAppendWithRegistry(r, dst, val)
-}
-
-// MarshalValueWithContext returns the BSON encoding of val using EncodeContext ec.
-//
-// Deprecated: Using a custom EncodeContext to marshal individual BSON elements will not be
-// supported in Go Driver 2.0.
-func MarshalValueWithContext(ec bsoncodec.EncodeContext, val interface{}) (bsontype.Type, []byte, error) {
- dst := make([]byte, 0)
- return MarshalValueAppendWithContext(ec, dst, val)
-}
-
-// MarshalValueAppendWithRegistry will append the BSON encoding of val to dst using Registry r. If dst is not large
-// enough to hold the BSON encoding of val, dst will be grown.
-//
-// Deprecated: Appending individual BSON elements to an existing slice will not be supported in Go
-// Driver 2.0.
-func MarshalValueAppendWithRegistry(r *bsoncodec.Registry, dst []byte, val interface{}) (bsontype.Type, []byte, error) {
- return MarshalValueAppendWithContext(bsoncodec.EncodeContext{Registry: r}, dst, val)
-}
-
-// MarshalValueAppendWithContext will append the BSON encoding of val to dst using EncodeContext ec. If dst is not large
-// enough to hold the BSON encoding of val, dst will be grown.
-//
-// Deprecated: Appending individual BSON elements to an existing slice will not be supported in Go
-// Driver 2.0.
-func MarshalValueAppendWithContext(ec bsoncodec.EncodeContext, dst []byte, val interface{}) (bsontype.Type, []byte, error) {
- // get a ValueWriter configured to write to dst
- sw := new(bsonrw.SliceWriter)
- *sw = dst
- vwFlusher := bvwPool.GetAtModeElement(sw)
-
- // get an Encoder and encode the value
- enc := encPool.Get().(*Encoder)
- defer encPool.Put(enc)
- if err := enc.Reset(vwFlusher); err != nil {
- return 0, nil, err
- }
- if err := enc.SetContext(ec); err != nil {
- return 0, nil, err
- }
- if err := enc.Encode(val); err != nil {
- return 0, nil, err
- }
-
- // flush the bytes written because we cannot guarantee that a full document has been written
- // after the flush, *sw will be in the format
- // [value type, 0 (null byte to indicate end of empty element name), value bytes..]
- if err := vwFlusher.Flush(); err != nil {
- return 0, nil, err
- }
- buffer := *sw
- return bsontype.Type(buffer[0]), buffer[2:], nil
-}
-
-// MarshalExtJSON returns the extended JSON encoding of val.
-func MarshalExtJSON(val interface{}, canonical, escapeHTML bool) ([]byte, error) {
- return MarshalExtJSONWithRegistry(DefaultRegistry, val, canonical, escapeHTML)
-}
-
-// MarshalExtJSONAppend will append the extended JSON encoding of val to dst.
-// If dst is not large enough to hold the extended JSON encoding of val, dst
-// will be grown.
-//
-// Deprecated: Use [NewEncoder] and pass the dst byte slice (wrapped by a bytes.Buffer) into
-// [bsonrw.NewExtJSONValueWriter] instead:
-//
-// buf := bytes.NewBuffer(dst)
-// vw, err := bsonrw.NewExtJSONValueWriter(buf, true, false)
-// if err != nil {
-// panic(err)
-// }
-// enc, err := bson.NewEncoder(vw)
-// if err != nil {
-// panic(err)
-// }
-//
-// See [Encoder] for more examples.
-func MarshalExtJSONAppend(dst []byte, val interface{}, canonical, escapeHTML bool) ([]byte, error) {
- return MarshalExtJSONAppendWithRegistry(DefaultRegistry, dst, val, canonical, escapeHTML)
-}
-
-// MarshalExtJSONWithRegistry returns the extended JSON encoding of val using Registry r.
-//
-// Deprecated: Use [NewEncoder] and specify the Registry by calling [Encoder.SetRegistry] instead:
-//
-// buf := new(bytes.Buffer)
-// vw, err := bsonrw.NewBSONValueWriter(buf)
-// if err != nil {
-// panic(err)
-// }
-// enc, err := bson.NewEncoder(vw)
-// if err != nil {
-// panic(err)
-// }
-// enc.SetRegistry(reg)
-//
-// See [Encoder] for more examples.
-func MarshalExtJSONWithRegistry(r *bsoncodec.Registry, val interface{}, canonical, escapeHTML bool) ([]byte, error) {
- dst := make([]byte, 0, defaultDstCap)
- return MarshalExtJSONAppendWithContext(bsoncodec.EncodeContext{Registry: r}, dst, val, canonical, escapeHTML)
-}
-
-// MarshalExtJSONWithContext returns the extended JSON encoding of val using Registry r.
-//
-// Deprecated: Use [NewEncoder] and use the Encoder configuration methods to set the desired marshal
-// behavior instead:
-//
-// buf := new(bytes.Buffer)
-// vw, err := bsonrw.NewBSONValueWriter(buf)
-// if err != nil {
-// panic(err)
-// }
-// enc, err := bson.NewEncoder(vw)
-// if err != nil {
-// panic(err)
-// }
-// enc.IntMinSize()
-//
-// See [Encoder] for more examples.
-func MarshalExtJSONWithContext(ec bsoncodec.EncodeContext, val interface{}, canonical, escapeHTML bool) ([]byte, error) {
- dst := make([]byte, 0, defaultDstCap)
- return MarshalExtJSONAppendWithContext(ec, dst, val, canonical, escapeHTML)
-}
-
-// MarshalExtJSONAppendWithRegistry will append the extended JSON encoding of
-// val to dst using Registry r. If dst is not large enough to hold the BSON
-// encoding of val, dst will be grown.
-//
-// Deprecated: Use [NewEncoder], pass the dst byte slice (wrapped by a bytes.Buffer) into
-// [bsonrw.NewExtJSONValueWriter], and specify the Registry by calling [Encoder.SetRegistry]
-// instead:
-//
-// buf := bytes.NewBuffer(dst)
-// vw, err := bsonrw.NewExtJSONValueWriter(buf, true, false)
-// if err != nil {
-// panic(err)
-// }
-// enc, err := bson.NewEncoder(vw)
-// if err != nil {
-// panic(err)
-// }
-//
-// See [Encoder] for more examples.
-func MarshalExtJSONAppendWithRegistry(r *bsoncodec.Registry, dst []byte, val interface{}, canonical, escapeHTML bool) ([]byte, error) {
- return MarshalExtJSONAppendWithContext(bsoncodec.EncodeContext{Registry: r}, dst, val, canonical, escapeHTML)
-}
-
-// MarshalExtJSONAppendWithContext will append the extended JSON encoding of
-// val to dst using Registry r. If dst is not large enough to hold the BSON
-// encoding of val, dst will be grown.
-//
-// Deprecated: Use [NewEncoder], pass the dst byte slice (wrapped by a bytes.Buffer) into
-// [bsonrw.NewExtJSONValueWriter], and use the Encoder configuration methods to set the desired marshal
-// behavior instead:
-//
-// buf := bytes.NewBuffer(dst)
-// vw, err := bsonrw.NewExtJSONValueWriter(buf, true, false)
-// if err != nil {
-// panic(err)
-// }
-// enc, err := bson.NewEncoder(vw)
-// if err != nil {
-// panic(err)
-// }
-// enc.IntMinSize()
-//
-// See [Encoder] for more examples.
-func MarshalExtJSONAppendWithContext(ec bsoncodec.EncodeContext, dst []byte, val interface{}, canonical, escapeHTML bool) ([]byte, error) {
- sw := new(bsonrw.SliceWriter)
- *sw = dst
- ejvw := extjPool.Get(sw, canonical, escapeHTML)
- defer extjPool.Put(ejvw)
-
- enc := encPool.Get().(*Encoder)
- defer encPool.Put(enc)
-
- err := enc.Reset(ejvw)
- if err != nil {
- return nil, err
- }
- err = enc.SetContext(ec)
- if err != nil {
- return nil, err
- }
-
- err = enc.Encode(val)
- if err != nil {
- return nil, err
- }
-
- return *sw, nil
-}
-
-// IndentExtJSON will prefix and indent the provided extended JSON src and append it to dst.
-func IndentExtJSON(dst *bytes.Buffer, src []byte, prefix, indent string) error {
- return json.Indent(dst, src, prefix, indent)
-}
-
-// MarshalExtJSONIndent returns the extended JSON encoding of val with each line with prefixed
-// and indented.
-func MarshalExtJSONIndent(val interface{}, canonical, escapeHTML bool, prefix, indent string) ([]byte, error) {
- marshaled, err := MarshalExtJSON(val, canonical, escapeHTML)
- if err != nil {
- return nil, err
- }
-
- var buf bytes.Buffer
- err = IndentExtJSON(&buf, marshaled, prefix, indent)
- if err != nil {
- return nil, err
- }
-
- return buf.Bytes(), nil
-}