github.com/mdaxf/iac@v0.0.0-20240519030858-58a061660378/vendor_skip/go.mongodb.org/mongo-driver/bson/raw_value.go (about)

     1  // Copyright (C) MongoDB, Inc. 2017-present.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License"); you may
     4  // not use this file except in compliance with the License. You may obtain
     5  // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
     6  
     7  package bson
     8  
     9  import (
    10  	"bytes"
    11  	"errors"
    12  	"fmt"
    13  	"reflect"
    14  	"time"
    15  
    16  	"go.mongodb.org/mongo-driver/bson/bsoncodec"
    17  	"go.mongodb.org/mongo-driver/bson/bsonrw"
    18  	"go.mongodb.org/mongo-driver/bson/bsontype"
    19  	"go.mongodb.org/mongo-driver/bson/primitive"
    20  	"go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
    21  )
    22  
    23  // ErrNilContext is returned when the provided DecodeContext is nil.
    24  var ErrNilContext = errors.New("DecodeContext cannot be nil")
    25  
    26  // ErrNilRegistry is returned when the provided registry is nil.
    27  var ErrNilRegistry = errors.New("Registry cannot be nil")
    28  
    29  // RawValue is a raw encoded BSON value. It can be used to delay BSON value decoding or precompute
    30  // BSON encoded value. Type is the BSON type of the value and Value is the raw encoded BSON value.
    31  //
    32  // A RawValue must be an individual BSON value. Use the Raw type for full BSON documents.
    33  type RawValue struct {
    34  	Type  bsontype.Type
    35  	Value []byte
    36  
    37  	r *bsoncodec.Registry
    38  }
    39  
    40  // IsZero reports whether the RawValue is zero, i.e. no data is present on
    41  // the RawValue. It returns true if Type is 0 and Value is empty or nil.
    42  func (rv RawValue) IsZero() bool {
    43  	return rv.Type == 0x00 && len(rv.Value) == 0
    44  }
    45  
    46  // Unmarshal deserializes BSON into the provided val. If RawValue cannot be unmarshaled into val, an
    47  // error is returned. This method will use the registry used to create the RawValue, if the RawValue
    48  // was created from partial BSON processing, or it will use the default registry. Users wishing to
    49  // specify the registry to use should use UnmarshalWithRegistry.
    50  func (rv RawValue) Unmarshal(val interface{}) error {
    51  	reg := rv.r
    52  	if reg == nil {
    53  		reg = DefaultRegistry
    54  	}
    55  	return rv.UnmarshalWithRegistry(reg, val)
    56  }
    57  
    58  // Equal compares rv and rv2 and returns true if they are equal.
    59  func (rv RawValue) Equal(rv2 RawValue) bool {
    60  	if rv.Type != rv2.Type {
    61  		return false
    62  	}
    63  
    64  	if !bytes.Equal(rv.Value, rv2.Value) {
    65  		return false
    66  	}
    67  
    68  	return true
    69  }
    70  
    71  // UnmarshalWithRegistry performs the same unmarshalling as Unmarshal but uses the provided registry
    72  // instead of the one attached or the default registry.
    73  func (rv RawValue) UnmarshalWithRegistry(r *bsoncodec.Registry, val interface{}) error {
    74  	if r == nil {
    75  		return ErrNilRegistry
    76  	}
    77  
    78  	vr := bsonrw.NewBSONValueReader(rv.Type, rv.Value)
    79  	rval := reflect.ValueOf(val)
    80  	if rval.Kind() != reflect.Ptr {
    81  		return fmt.Errorf("argument to Unmarshal* must be a pointer to a type, but got %v", rval)
    82  	}
    83  	rval = rval.Elem()
    84  	dec, err := r.LookupDecoder(rval.Type())
    85  	if err != nil {
    86  		return err
    87  	}
    88  	return dec.DecodeValue(bsoncodec.DecodeContext{Registry: r}, vr, rval)
    89  }
    90  
    91  // UnmarshalWithContext performs the same unmarshalling as Unmarshal but uses the provided DecodeContext
    92  // instead of the one attached or the default registry.
    93  func (rv RawValue) UnmarshalWithContext(dc *bsoncodec.DecodeContext, val interface{}) error {
    94  	if dc == nil {
    95  		return ErrNilContext
    96  	}
    97  
    98  	vr := bsonrw.NewBSONValueReader(rv.Type, rv.Value)
    99  	rval := reflect.ValueOf(val)
   100  	if rval.Kind() != reflect.Ptr {
   101  		return fmt.Errorf("argument to Unmarshal* must be a pointer to a type, but got %v", rval)
   102  	}
   103  	rval = rval.Elem()
   104  	dec, err := dc.LookupDecoder(rval.Type())
   105  	if err != nil {
   106  		return err
   107  	}
   108  	return dec.DecodeValue(*dc, vr, rval)
   109  }
   110  
   111  func convertFromCoreValue(v bsoncore.Value) RawValue { return RawValue{Type: v.Type, Value: v.Data} }
   112  func convertToCoreValue(v RawValue) bsoncore.Value {
   113  	return bsoncore.Value{Type: v.Type, Data: v.Value}
   114  }
   115  
   116  // Validate ensures the value is a valid BSON value.
   117  func (rv RawValue) Validate() error { return convertToCoreValue(rv).Validate() }
   118  
   119  // IsNumber returns true if the type of v is a numeric BSON type.
   120  func (rv RawValue) IsNumber() bool { return convertToCoreValue(rv).IsNumber() }
   121  
   122  // String implements the fmt.String interface. This method will return values in extended JSON
   123  // format. If the value is not valid, this returns an empty string
   124  func (rv RawValue) String() string { return convertToCoreValue(rv).String() }
   125  
   126  // DebugString outputs a human readable version of Document. It will attempt to stringify the
   127  // valid components of the document even if the entire document is not valid.
   128  func (rv RawValue) DebugString() string { return convertToCoreValue(rv).DebugString() }
   129  
   130  // Double returns the float64 value for this element.
   131  // It panics if e's BSON type is not bsontype.Double.
   132  func (rv RawValue) Double() float64 { return convertToCoreValue(rv).Double() }
   133  
   134  // DoubleOK is the same as Double, but returns a boolean instead of panicking.
   135  func (rv RawValue) DoubleOK() (float64, bool) { return convertToCoreValue(rv).DoubleOK() }
   136  
   137  // StringValue returns the string value for this element.
   138  // It panics if e's BSON type is not bsontype.String.
   139  //
   140  // NOTE: This method is called StringValue to avoid a collision with the String method which
   141  // implements the fmt.Stringer interface.
   142  func (rv RawValue) StringValue() string { return convertToCoreValue(rv).StringValue() }
   143  
   144  // StringValueOK is the same as StringValue, but returns a boolean instead of
   145  // panicking.
   146  func (rv RawValue) StringValueOK() (string, bool) { return convertToCoreValue(rv).StringValueOK() }
   147  
   148  // Document returns the BSON document the Value represents as a Document. It panics if the
   149  // value is a BSON type other than document.
   150  func (rv RawValue) Document() Raw { return Raw(convertToCoreValue(rv).Document()) }
   151  
   152  // DocumentOK is the same as Document, except it returns a boolean
   153  // instead of panicking.
   154  func (rv RawValue) DocumentOK() (Raw, bool) {
   155  	doc, ok := convertToCoreValue(rv).DocumentOK()
   156  	return Raw(doc), ok
   157  }
   158  
   159  // Array returns the BSON array the Value represents as an Array. It panics if the
   160  // value is a BSON type other than array.
   161  func (rv RawValue) Array() Raw { return Raw(convertToCoreValue(rv).Array()) }
   162  
   163  // ArrayOK is the same as Array, except it returns a boolean instead
   164  // of panicking.
   165  func (rv RawValue) ArrayOK() (Raw, bool) {
   166  	doc, ok := convertToCoreValue(rv).ArrayOK()
   167  	return Raw(doc), ok
   168  }
   169  
   170  // Binary returns the BSON binary value the Value represents. It panics if the value is a BSON type
   171  // other than binary.
   172  func (rv RawValue) Binary() (subtype byte, data []byte) { return convertToCoreValue(rv).Binary() }
   173  
   174  // BinaryOK is the same as Binary, except it returns a boolean instead of
   175  // panicking.
   176  func (rv RawValue) BinaryOK() (subtype byte, data []byte, ok bool) {
   177  	return convertToCoreValue(rv).BinaryOK()
   178  }
   179  
   180  // ObjectID returns the BSON objectid value the Value represents. It panics if the value is a BSON
   181  // type other than objectid.
   182  func (rv RawValue) ObjectID() primitive.ObjectID { return convertToCoreValue(rv).ObjectID() }
   183  
   184  // ObjectIDOK is the same as ObjectID, except it returns a boolean instead of
   185  // panicking.
   186  func (rv RawValue) ObjectIDOK() (primitive.ObjectID, bool) {
   187  	return convertToCoreValue(rv).ObjectIDOK()
   188  }
   189  
   190  // Boolean returns the boolean value the Value represents. It panics if the
   191  // value is a BSON type other than boolean.
   192  func (rv RawValue) Boolean() bool { return convertToCoreValue(rv).Boolean() }
   193  
   194  // BooleanOK is the same as Boolean, except it returns a boolean instead of
   195  // panicking.
   196  func (rv RawValue) BooleanOK() (bool, bool) { return convertToCoreValue(rv).BooleanOK() }
   197  
   198  // DateTime returns the BSON datetime value the Value represents as a
   199  // unix timestamp. It panics if the value is a BSON type other than datetime.
   200  func (rv RawValue) DateTime() int64 { return convertToCoreValue(rv).DateTime() }
   201  
   202  // DateTimeOK is the same as DateTime, except it returns a boolean instead of
   203  // panicking.
   204  func (rv RawValue) DateTimeOK() (int64, bool) { return convertToCoreValue(rv).DateTimeOK() }
   205  
   206  // Time returns the BSON datetime value the Value represents. It panics if the value is a BSON
   207  // type other than datetime.
   208  func (rv RawValue) Time() time.Time { return convertToCoreValue(rv).Time() }
   209  
   210  // TimeOK is the same as Time, except it returns a boolean instead of
   211  // panicking.
   212  func (rv RawValue) TimeOK() (time.Time, bool) { return convertToCoreValue(rv).TimeOK() }
   213  
   214  // Regex returns the BSON regex value the Value represents. It panics if the value is a BSON
   215  // type other than regex.
   216  func (rv RawValue) Regex() (pattern, options string) { return convertToCoreValue(rv).Regex() }
   217  
   218  // RegexOK is the same as Regex, except it returns a boolean instead of
   219  // panicking.
   220  func (rv RawValue) RegexOK() (pattern, options string, ok bool) {
   221  	return convertToCoreValue(rv).RegexOK()
   222  }
   223  
   224  // DBPointer returns the BSON dbpointer value the Value represents. It panics if the value is a BSON
   225  // type other than DBPointer.
   226  func (rv RawValue) DBPointer() (string, primitive.ObjectID) {
   227  	return convertToCoreValue(rv).DBPointer()
   228  }
   229  
   230  // DBPointerOK is the same as DBPoitner, except that it returns a boolean
   231  // instead of panicking.
   232  func (rv RawValue) DBPointerOK() (string, primitive.ObjectID, bool) {
   233  	return convertToCoreValue(rv).DBPointerOK()
   234  }
   235  
   236  // JavaScript returns the BSON JavaScript code value the Value represents. It panics if the value is
   237  // a BSON type other than JavaScript code.
   238  func (rv RawValue) JavaScript() string { return convertToCoreValue(rv).JavaScript() }
   239  
   240  // JavaScriptOK is the same as Javascript, excepti that it returns a boolean
   241  // instead of panicking.
   242  func (rv RawValue) JavaScriptOK() (string, bool) { return convertToCoreValue(rv).JavaScriptOK() }
   243  
   244  // Symbol returns the BSON symbol value the Value represents. It panics if the value is a BSON
   245  // type other than symbol.
   246  func (rv RawValue) Symbol() string { return convertToCoreValue(rv).Symbol() }
   247  
   248  // SymbolOK is the same as Symbol, excepti that it returns a boolean
   249  // instead of panicking.
   250  func (rv RawValue) SymbolOK() (string, bool) { return convertToCoreValue(rv).SymbolOK() }
   251  
   252  // CodeWithScope returns the BSON JavaScript code with scope the Value represents.
   253  // It panics if the value is a BSON type other than JavaScript code with scope.
   254  func (rv RawValue) CodeWithScope() (string, Raw) {
   255  	code, scope := convertToCoreValue(rv).CodeWithScope()
   256  	return code, Raw(scope)
   257  }
   258  
   259  // CodeWithScopeOK is the same as CodeWithScope, except that it returns a boolean instead of
   260  // panicking.
   261  func (rv RawValue) CodeWithScopeOK() (string, Raw, bool) {
   262  	code, scope, ok := convertToCoreValue(rv).CodeWithScopeOK()
   263  	return code, Raw(scope), ok
   264  }
   265  
   266  // Int32 returns the int32 the Value represents. It panics if the value is a BSON type other than
   267  // int32.
   268  func (rv RawValue) Int32() int32 { return convertToCoreValue(rv).Int32() }
   269  
   270  // Int32OK is the same as Int32, except that it returns a boolean instead of
   271  // panicking.
   272  func (rv RawValue) Int32OK() (int32, bool) { return convertToCoreValue(rv).Int32OK() }
   273  
   274  // AsInt32 returns a BSON number as an int32. If the BSON type is not a numeric one, this method
   275  // will panic.
   276  //
   277  // Deprecated: Use AsInt64 instead. If an int32 is required, convert the returned value to an int32
   278  // and perform any required overflow/underflow checking.
   279  func (rv RawValue) AsInt32() int32 { return convertToCoreValue(rv).AsInt32() }
   280  
   281  // AsInt32OK is the same as AsInt32, except that it returns a boolean instead of
   282  // panicking.
   283  //
   284  // Deprecated: Use AsInt64OK instead. If an int32 is required, convert the returned value to an
   285  // int32 and perform any required overflow/underflow checking.
   286  func (rv RawValue) AsInt32OK() (int32, bool) { return convertToCoreValue(rv).AsInt32OK() }
   287  
   288  // Timestamp returns the BSON timestamp value the Value represents. It panics if the value is a
   289  // BSON type other than timestamp.
   290  func (rv RawValue) Timestamp() (t, i uint32) { return convertToCoreValue(rv).Timestamp() }
   291  
   292  // TimestampOK is the same as Timestamp, except that it returns a boolean
   293  // instead of panicking.
   294  func (rv RawValue) TimestampOK() (t, i uint32, ok bool) { return convertToCoreValue(rv).TimestampOK() }
   295  
   296  // Int64 returns the int64 the Value represents. It panics if the value is a BSON type other than
   297  // int64.
   298  func (rv RawValue) Int64() int64 { return convertToCoreValue(rv).Int64() }
   299  
   300  // Int64OK is the same as Int64, except that it returns a boolean instead of
   301  // panicking.
   302  func (rv RawValue) Int64OK() (int64, bool) { return convertToCoreValue(rv).Int64OK() }
   303  
   304  // AsInt64 returns a BSON number as an int64. If the BSON type is not a numeric one, this method
   305  // will panic.
   306  func (rv RawValue) AsInt64() int64 { return convertToCoreValue(rv).AsInt64() }
   307  
   308  // AsInt64OK is the same as AsInt64, except that it returns a boolean instead of
   309  // panicking.
   310  func (rv RawValue) AsInt64OK() (int64, bool) { return convertToCoreValue(rv).AsInt64OK() }
   311  
   312  // Decimal128 returns the decimal the Value represents. It panics if the value is a BSON type other than
   313  // decimal.
   314  func (rv RawValue) Decimal128() primitive.Decimal128 { return convertToCoreValue(rv).Decimal128() }
   315  
   316  // Decimal128OK is the same as Decimal128, except that it returns a boolean
   317  // instead of panicking.
   318  func (rv RawValue) Decimal128OK() (primitive.Decimal128, bool) {
   319  	return convertToCoreValue(rv).Decimal128OK()
   320  }