wirebson

package
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 15, 2024 License: Apache-2.0 Imports: 14 Imported by: 1

Documentation

Overview

Package wirebson implements encoding and decoding of BSON as defined by https://bsonspec.org/spec.html.

Types

The following BSON types are supported:

BSON                Go

Document/Object     *bson.Document or bson.RawDocument
Array               *bson.Array    or bson.RawArray

Double              float64
String              string
Binary data         bson.Binary
ObjectId            bson.ObjectID
Boolean             bool
Date                time.Time
Null                bson.NullType
Regular Expression  bson.Regex
32-bit integer      int32
Timestamp           bson.Timestamp
64-bit integer      int64
Decimal128          bson.Decimal128

Composite types (Document and Array) are passed by pointers. Raw composite type and scalars are passed by values.

Index

Constants

View Source
const (
	// BinaryGeneric represents a BSON Binary generic subtype.
	BinaryGeneric = bsonproto.BinaryGeneric

	// BinaryFunction represents a BSON Binary function subtype.
	BinaryFunction = bsonproto.BinaryFunction

	// BinaryGenericOld represents a BSON Binary generic-old subtype.
	BinaryGenericOld = bsonproto.BinaryGenericOld

	// BinaryUUIDOld represents a BSON Binary UUID old subtype.
	BinaryUUIDOld = bsonproto.BinaryUUIDOld

	// BinaryUUID represents a BSON Binary UUID subtype.
	BinaryUUID = bsonproto.BinaryUUID

	// BinaryMD5 represents a BSON Binary MD5 subtype.
	BinaryMD5 = bsonproto.BinaryMD5

	// BinaryEncrypted represents a BSON Binary encrypted subtype.
	BinaryEncrypted = bsonproto.BinaryEncrypted

	// BinaryUser represents a BSON Binary user-defined subtype.
	BinaryUser = bsonproto.BinaryUser
)

Variables

View Source
var (
	// ErrDecodeShortInput is returned wrapped by Decode functions if the input bytes slice is too short.
	ErrDecodeShortInput = bsonproto.ErrDecodeShortInput

	// ErrDecodeInvalidInput is returned wrapped by Decode functions if the input bytes slice is invalid.
	ErrDecodeInvalidInput = bsonproto.ErrDecodeInvalidInput
)

Null represents BSON scalar value null.

Functions

func DecodeCString

func DecodeCString(b []byte) (string, error)

DecodeCString decodes cstring value from b.

If there is not enough bytes, DecodeCString will return a wrapped ErrDecodeShortInput. If the input is otherwise invalid, a wrapped ErrDecodeInvalidInput is returned.

func EncodeCString

func EncodeCString(b []byte, v string)

EncodeCString encodes cstring value v into b.

Slice must be at least len(v)+1 (SizeCString) bytes long; otherwise, EncodeString will panic. Only b[0:len(v)+1] bytes are modified.

func FindRaw

func FindRaw(b []byte) (int, error)

FindRaw finds the first raw BSON document or array in b and returns its length l. It should start from the first byte of b. RawDocument(b[:l] / RawArray(b[:l]) might not be valid. It is the caller's responsibility to check it.

Use RawDocument(b) / RawArray(b) conversion instead if b contains exactly one document/array and no extra bytes.

func LogMessage

func LogMessage(v any) string

LogMessage returns a representation as a string. It may change over time.

func LogMessageBlock

func LogMessageBlock(v any) string

LogMessageBlock is a variant of [RawArray.LogMessage] that never uses a flow style.

func LogMessageFlow

func LogMessageFlow(v any) string

LogMessageFlow is a variant of [RawArray.LogMessage] that always uses a flow style.

func SizeCString

func SizeCString(s string) int

SizeCString returns a size of the encoding of v cstring in bytes.

Types

type AnyArray

type AnyArray interface {
	Encode() (RawArray, error)
	Decode() (*Array, error)
}

AnyArray represents a BSON array type (both *Array and RawArray).

Note that the Encode and Decode methods could return the receiver itself, so care must be taken when results are modified.

type AnyDocument

type AnyDocument interface {
	Encode() (RawDocument, error)
	Decode() (*Document, error)
}

AnyDocument represents a BSON document type (both *Document and RawDocument).

Note that the Encode and Decode methods could return the receiver itself, so care must be taken when results are modified.

type Array

type Array struct {
	// contains filtered or unexported fields
}

Array represents a BSON array in the (partially) decoded form.

func MakeArray

func MakeArray(cap int) *Array

MakeArray creates a new empty Array with the given capacity.

func NewArray

func NewArray(values ...any) (*Array, error)

NewArray creates a new Array from the given values.

func (*Array) Add

func (arr *Array) Add(value any) error

Add adds a new element to the Array.

func (*Array) Decode

func (arr *Array) Decode() (*Array, error)

Decode returns itself to implement AnyArray.

Receiver must not be nil.

func (*Array) Encode

func (arr *Array) Encode() (RawArray, error)

Encode encodes non-nil BSON array.

TODO https://github.com/FerretDB/FerretDB/issues/3759 This method should accept a slice of bytes, not return it. That would allow to avoid unnecessary allocations.

Receiver must not be nil.

func (*Array) Freeze

func (arr *Array) Freeze()

Freeze prevents array from further modifications. Any methods that would modify the array will panic.

It is safe to call Freeze multiple times.

func (*Array) Get

func (arr *Array) Get(index int) any

Get returns the element at the given index. It panics if index is out of bounds.

func (*Array) Len

func (arr *Array) Len() int

Len returns the number of elements in the Array.

func (*Array) LogValue

func (arr *Array) LogValue() slog.Value

LogValue implements slog.LogValuer.

func (*Array) Replace

func (arr *Array) Replace(index int, value any) error

Replace sets the value of the element at the given index. It panics if index is out of bounds.

type Binary

type Binary = bsonproto.Binary

Binary represents BSON scalar type binary.

type BinarySubtype

type BinarySubtype = bsonproto.BinarySubtype

BinarySubtype represents BSON Binary's subtype.

type CompositeType

type CompositeType interface {
	*Document | *Array | RawDocument | RawArray
}

CompositeType represents a BSON composite type (including raw types).

type Decimal128

type Decimal128 = bsonproto.Decimal128

Decimal128 represents BSON scalar type decimal128.

type Document

type Document struct {
	// contains filtered or unexported fields
}

Document represents a BSON document a.k.a object in the (partially) decoded form.

It may contain duplicate field names.

func MakeDocument

func MakeDocument(cap int) *Document

MakeDocument creates a new empty Document with the given capacity.

func NewDocument

func NewDocument(pairs ...any) (*Document, error)

NewDocument creates a new Document from the given pairs of field names and values.

func (*Document) Add

func (doc *Document) Add(name string, value any) error

Add adds a new field to the Document.

func (*Document) Command

func (doc *Document) Command() string

Command returns the first field name. This is often used as a command name. It returns an empty string if document is nil or empty.

func (*Document) Decode

func (doc *Document) Decode() (*Document, error)

Decode returns itself to implement AnyDocument.

Receiver must not be nil.

func (*Document) Encode

func (doc *Document) Encode() (RawDocument, error)

Encode encodes non-nil BSON document.

TODO https://github.com/FerretDB/FerretDB/issues/3759 This method should accept a slice of bytes, not return it. That would allow to avoid unnecessary allocations.

Receiver must not be nil.

func (*Document) FieldNames

func (doc *Document) FieldNames() []string

FieldNames returns a slice of field names in the Document.

If document contains duplicate field names, the same name may appear multiple times.

func (*Document) Freeze

func (doc *Document) Freeze()

Freeze prevents document from further field modifications. Any methods that would modify document fields will panic.

It is safe to call Freeze multiple times.

func (*Document) Get

func (doc *Document) Get(name string) any

Get returns a value of the field with the given name.

It returns nil if the field is not found. If document contains duplicate field names, it returns the first one.

TODO https://github.com/FerretDB/FerretDB/issues/4208

func (*Document) LogValue

func (doc *Document) LogValue() slog.Value

LogValue implements slog.LogValuer.

func (*Document) Remove

func (doc *Document) Remove(name string)

Remove removes the first existing field with the given name. It does nothing if the field with that name does not exist.

func (*Document) Replace

func (doc *Document) Replace(name string, value any) error

Replace sets the value for the first existing field with the given name. It does nothing if the field with that name does not exist.

type NullType

type NullType = bsonproto.NullType

NullType represents BSON scalar type null.

type ObjectID

type ObjectID = bsonproto.ObjectID

ObjectID represents BSON scalar type ObjectID.

type RawArray

type RawArray []byte

RawArray represents a single BSON array in the binary encoded form.

It generally references a part of a larger slice, not a copy.

func (RawArray) Decode

func (raw RawArray) Decode() (*Array, error)

Decode decodes a single BSON array that takes the whole not-nil byte slice.

Only top-level elements are decoded; nested documents and arrays are converted to RawDocument and RawArray respectively, using raw's subslices without copying.

Receiver must not be nil.

func (RawArray) DecodeDeep

func (raw RawArray) DecodeDeep() (*Array, error)

DecodeDeep decodes a single valid BSON array that takes the whole not-nil byte slice.

All nested documents and arrays are decoded recursively.

Receiver must not be nil.

func (RawArray) Encode

func (raw RawArray) Encode() (RawArray, error)

Encode returns itself to implement the AnyArray interface.

Receiver must not be nil.

func (RawArray) LogValue

func (raw RawArray) LogValue() slog.Value

LogValue implements slog.LogValuer.

type RawDocument

type RawDocument []byte

RawDocument represents a single BSON document a.k.a object in the binary encoded form.

It generally references a part of a larger slice, not a copy.

func (RawDocument) Decode

func (raw RawDocument) Decode() (*Document, error)

Decode decodes a single BSON document that takes the whole not-nil byte slice.

Only top-level fields are decoded; nested documents and arrays are converted to RawDocument and RawArray respectively, using raw's subslices without copying.

Receiver must not be nil.

func (RawDocument) DecodeDeep

func (raw RawDocument) DecodeDeep() (*Document, error)

DecodeDeep decodes a single valid BSON document that takes the whole not-nil byte slice.

All nested documents and arrays are decoded recursively.

Receiver must not be nil.

func (RawDocument) Encode

func (raw RawDocument) Encode() (RawDocument, error)

Encode returns itself to implement the AnyDocument interface.

Receiver must not be nil.

func (RawDocument) LogValue

func (raw RawDocument) LogValue() slog.Value

LogValue implements slog.LogValuer.

type Regex

type Regex = bsonproto.Regex

Regex represents BSON scalar type regular expression.

type ScalarType

type ScalarType = bsonproto.ScalarType

ScalarType represents a BSON scalar type.

CString is not included as it is not a real BSON type.

type Timestamp

type Timestamp = bsonproto.Timestamp

Timestamp represents BSON scalar type timestamp.

type Type

type Type interface {
	ScalarType | CompositeType
}

Type represents a BSON type.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL