| // 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 ( |
| "github.com/mongodb/mongo-go-driver/bson/bsontype" |
| "github.com/mongodb/mongo-go-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 |
| } |