97 lines
2.8 KiB
Go
97 lines
2.8 KiB
Go
|
// 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 bsonrw
|
||
|
|
||
|
import (
|
||
|
"go.mongodb.org/mongo-driver/bson/bsontype"
|
||
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||
|
)
|
||
|
|
||
|
// ArrayWriter is the interface used to create a BSON or BSON adjacent array.
|
||
|
// Callers must ensure they call WriteArrayEnd when they have finished creating
|
||
|
// the array.
|
||
|
type ArrayWriter interface {
|
||
|
WriteArrayElement() (ValueWriter, error)
|
||
|
WriteArrayEnd() error
|
||
|
}
|
||
|
|
||
|
// DocumentWriter is the interface used to create a BSON or BSON adjacent
|
||
|
// document. Callers must ensure they call WriteDocumentEnd when they have
|
||
|
// finished creating the document.
|
||
|
type DocumentWriter interface {
|
||
|
WriteDocumentElement(string) (ValueWriter, error)
|
||
|
WriteDocumentEnd() error
|
||
|
}
|
||
|
|
||
|
// ValueWriter is the interface used to write BSON values. Implementations of
|
||
|
// this interface handle creating BSON or BSON adjacent representations of the
|
||
|
// values.
|
||
|
type ValueWriter interface {
|
||
|
WriteArray() (ArrayWriter, error)
|
||
|
WriteBinary(b []byte) error
|
||
|
WriteBinaryWithSubtype(b []byte, btype byte) error
|
||
|
WriteBoolean(bool) error
|
||
|
WriteCodeWithScope(code string) (DocumentWriter, error)
|
||
|
WriteDBPointer(ns string, oid primitive.ObjectID) error
|
||
|
WriteDateTime(dt int64) error
|
||
|
WriteDecimal128(primitive.Decimal128) error
|
||
|
WriteDouble(float64) error
|
||
|
WriteInt32(int32) error
|
||
|
WriteInt64(int64) error
|
||
|
WriteJavascript(code string) error
|
||
|
WriteMaxKey() error
|
||
|
WriteMinKey() error
|
||
|
WriteNull() error
|
||
|
WriteObjectID(primitive.ObjectID) error
|
||
|
WriteRegex(pattern, options string) error
|
||
|
WriteString(string) error
|
||
|
WriteDocument() (DocumentWriter, error)
|
||
|
WriteSymbol(symbol string) error
|
||
|
WriteTimestamp(t, i uint32) error
|
||
|
WriteUndefined() error
|
||
|
}
|
||
|
|
||
|
// BytesWriter is the interface used to write BSON bytes to a ValueWriter.
|
||
|
// This interface is meant to be a superset of ValueWriter, so that types that
|
||
|
// implement ValueWriter may also implement this interface.
|
||
|
type BytesWriter interface {
|
||
|
WriteValueBytes(t bsontype.Type, b []byte) error
|
||
|
}
|
||
|
|
||
|
// SliceWriter allows a pointer to a slice of bytes to be used as an io.Writer.
|
||
|
type SliceWriter []byte
|
||
|
|
||
|
func (sw *SliceWriter) Write(p []byte) (int, error) {
|
||
|
written := len(p)
|
||
|
*sw = append(*sw, p...)
|
||
|
return written, nil
|
||
|
}
|
||
|
|
||
|
type writer []byte
|
||
|
|
||
|
func (w *writer) Write(p []byte) (int, error) {
|
||
|
index := len(*w)
|
||
|
return w.WriteAt(p, int64(index))
|
||
|
}
|
||
|
|
||
|
func (w *writer) WriteAt(p []byte, off int64) (int, error) {
|
||
|
newend := off + int64(len(p))
|
||
|
if newend < int64(len(*w)) {
|
||
|
newend = int64(len(*w))
|
||
|
}
|
||
|
|
||
|
if newend > int64(cap(*w)) {
|
||
|
buf := make([]byte, int64(2*cap(*w))+newend)
|
||
|
copy(buf, *w)
|
||
|
*w = buf
|
||
|
}
|
||
|
|
||
|
*w = []byte(*w)[:newend]
|
||
|
copy([]byte(*w)[off:], p)
|
||
|
return len(p), nil
|
||
|
}
|