primitive_codecs.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. package bson
  7. import (
  8. "errors"
  9. "reflect"
  10. "go.mongodb.org/mongo-driver/bson/bsoncodec"
  11. "go.mongodb.org/mongo-driver/bson/bsonrw"
  12. )
  13. var tRawValue = reflect.TypeOf(RawValue{})
  14. var tRaw = reflect.TypeOf(Raw(nil))
  15. var primitiveCodecs PrimitiveCodecs
  16. // PrimitiveCodecs is a namespace for all of the default bsoncodec.Codecs for the primitive types
  17. // defined in this package.
  18. //
  19. // Deprecated: Use bson.NewRegistry to get a registry with all primitive encoders and decoders
  20. // registered.
  21. type PrimitiveCodecs struct{}
  22. // RegisterPrimitiveCodecs will register the encode and decode methods attached to PrimitiveCodecs
  23. // with the provided RegistryBuilder. if rb is nil, a new empty RegistryBuilder will be created.
  24. //
  25. // Deprecated: Use bson.NewRegistry to get a registry with all primitive encoders and decoders
  26. // registered.
  27. func (pc PrimitiveCodecs) RegisterPrimitiveCodecs(rb *bsoncodec.RegistryBuilder) {
  28. if rb == nil {
  29. panic(errors.New("argument to RegisterPrimitiveCodecs must not be nil"))
  30. }
  31. rb.
  32. RegisterTypeEncoder(tRawValue, bsoncodec.ValueEncoderFunc(pc.RawValueEncodeValue)).
  33. RegisterTypeEncoder(tRaw, bsoncodec.ValueEncoderFunc(pc.RawEncodeValue)).
  34. RegisterTypeDecoder(tRawValue, bsoncodec.ValueDecoderFunc(pc.RawValueDecodeValue)).
  35. RegisterTypeDecoder(tRaw, bsoncodec.ValueDecoderFunc(pc.RawDecodeValue))
  36. }
  37. // RawValueEncodeValue is the ValueEncoderFunc for RawValue.
  38. //
  39. // Deprecated: Use bson.NewRegistry to get a registry with all primitive encoders and decoders
  40. // registered.
  41. func (PrimitiveCodecs) RawValueEncodeValue(_ bsoncodec.EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  42. if !val.IsValid() || val.Type() != tRawValue {
  43. return bsoncodec.ValueEncoderError{Name: "RawValueEncodeValue", Types: []reflect.Type{tRawValue}, Received: val}
  44. }
  45. rawvalue := val.Interface().(RawValue)
  46. return bsonrw.Copier{}.CopyValueFromBytes(vw, rawvalue.Type, rawvalue.Value)
  47. }
  48. // RawValueDecodeValue is the ValueDecoderFunc for RawValue.
  49. //
  50. // Deprecated: Use bson.NewRegistry to get a registry with all primitive encoders and decoders
  51. // registered.
  52. func (PrimitiveCodecs) RawValueDecodeValue(_ bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
  53. if !val.CanSet() || val.Type() != tRawValue {
  54. return bsoncodec.ValueDecoderError{Name: "RawValueDecodeValue", Types: []reflect.Type{tRawValue}, Received: val}
  55. }
  56. t, value, err := bsonrw.Copier{}.CopyValueToBytes(vr)
  57. if err != nil {
  58. return err
  59. }
  60. val.Set(reflect.ValueOf(RawValue{Type: t, Value: value}))
  61. return nil
  62. }
  63. // RawEncodeValue is the ValueEncoderFunc for Reader.
  64. //
  65. // Deprecated: Use bson.NewRegistry to get a registry with all primitive encoders and decoders
  66. // registered.
  67. func (PrimitiveCodecs) RawEncodeValue(_ bsoncodec.EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  68. if !val.IsValid() || val.Type() != tRaw {
  69. return bsoncodec.ValueEncoderError{Name: "RawEncodeValue", Types: []reflect.Type{tRaw}, Received: val}
  70. }
  71. rdr := val.Interface().(Raw)
  72. return bsonrw.Copier{}.CopyDocumentFromBytes(vw, rdr)
  73. }
  74. // RawDecodeValue is the ValueDecoderFunc for Reader.
  75. //
  76. // Deprecated: Use bson.NewRegistry to get a registry with all primitive encoders and decoders
  77. // registered.
  78. func (PrimitiveCodecs) RawDecodeValue(_ bsoncodec.DecodeContext, vr bsonrw.ValueReader, val reflect.Value) error {
  79. if !val.CanSet() || val.Type() != tRaw {
  80. return bsoncodec.ValueDecoderError{Name: "RawDecodeValue", Types: []reflect.Type{tRaw}, Received: val}
  81. }
  82. if val.IsNil() {
  83. val.Set(reflect.MakeSlice(val.Type(), 0, 0))
  84. }
  85. val.SetLen(0)
  86. rdr, err := bsonrw.Copier{}.AppendDocumentBytes(val.Interface().(Raw), vr)
  87. val.Set(reflect.ValueOf(rdr))
  88. return err
  89. }