default_value_encoders.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  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 bsoncodec
  7. import (
  8. "encoding/json"
  9. "errors"
  10. "fmt"
  11. "math"
  12. "net/url"
  13. "reflect"
  14. "sync"
  15. "time"
  16. "go.mongodb.org/mongo-driver/bson/bsonrw"
  17. "go.mongodb.org/mongo-driver/bson/bsontype"
  18. "go.mongodb.org/mongo-driver/bson/primitive"
  19. "go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
  20. )
  21. var defaultValueEncoders DefaultValueEncoders
  22. var bvwPool = bsonrw.NewBSONValueWriterPool()
  23. var sliceWriterPool = sync.Pool{
  24. New: func() interface{} {
  25. sw := make(bsonrw.SliceWriter, 0, 0)
  26. return &sw
  27. },
  28. }
  29. func encodeElement(ec EncodeContext, dw bsonrw.DocumentWriter, e primitive.E) error {
  30. vw, err := dw.WriteDocumentElement(e.Key)
  31. if err != nil {
  32. return err
  33. }
  34. if e.Value == nil {
  35. return vw.WriteNull()
  36. }
  37. encoder, err := ec.LookupEncoder(reflect.TypeOf(e.Value))
  38. if err != nil {
  39. return err
  40. }
  41. err = encoder.EncodeValue(ec, vw, reflect.ValueOf(e.Value))
  42. if err != nil {
  43. return err
  44. }
  45. return nil
  46. }
  47. // DefaultValueEncoders is a namespace type for the default ValueEncoders used
  48. // when creating a registry.
  49. type DefaultValueEncoders struct{}
  50. // RegisterDefaultEncoders will register the encoder methods attached to DefaultValueEncoders with
  51. // the provided RegistryBuilder.
  52. func (dve DefaultValueEncoders) RegisterDefaultEncoders(rb *RegistryBuilder) {
  53. if rb == nil {
  54. panic(errors.New("argument to RegisterDefaultEncoders must not be nil"))
  55. }
  56. rb.
  57. RegisterEncoder(tByteSlice, ValueEncoderFunc(dve.ByteSliceEncodeValue)).
  58. RegisterEncoder(tTime, ValueEncoderFunc(dve.TimeEncodeValue)).
  59. RegisterEncoder(tEmpty, ValueEncoderFunc(dve.EmptyInterfaceEncodeValue)).
  60. RegisterEncoder(tOID, ValueEncoderFunc(dve.ObjectIDEncodeValue)).
  61. RegisterEncoder(tDecimal, ValueEncoderFunc(dve.Decimal128EncodeValue)).
  62. RegisterEncoder(tJSONNumber, ValueEncoderFunc(dve.JSONNumberEncodeValue)).
  63. RegisterEncoder(tURL, ValueEncoderFunc(dve.URLEncodeValue)).
  64. RegisterEncoder(tValueMarshaler, ValueEncoderFunc(dve.ValueMarshalerEncodeValue)).
  65. RegisterEncoder(tMarshaler, ValueEncoderFunc(dve.MarshalerEncodeValue)).
  66. RegisterEncoder(tProxy, ValueEncoderFunc(dve.ProxyEncodeValue)).
  67. RegisterEncoder(tJavaScript, ValueEncoderFunc(dve.JavaScriptEncodeValue)).
  68. RegisterEncoder(tSymbol, ValueEncoderFunc(dve.SymbolEncodeValue)).
  69. RegisterEncoder(tBinary, ValueEncoderFunc(dve.BinaryEncodeValue)).
  70. RegisterEncoder(tUndefined, ValueEncoderFunc(dve.UndefinedEncodeValue)).
  71. RegisterEncoder(tDateTime, ValueEncoderFunc(dve.DateTimeEncodeValue)).
  72. RegisterEncoder(tNull, ValueEncoderFunc(dve.NullEncodeValue)).
  73. RegisterEncoder(tRegex, ValueEncoderFunc(dve.RegexEncodeValue)).
  74. RegisterEncoder(tDBPointer, ValueEncoderFunc(dve.DBPointerEncodeValue)).
  75. RegisterEncoder(tTimestamp, ValueEncoderFunc(dve.TimestampEncodeValue)).
  76. RegisterEncoder(tMinKey, ValueEncoderFunc(dve.MinKeyEncodeValue)).
  77. RegisterEncoder(tMaxKey, ValueEncoderFunc(dve.MaxKeyEncodeValue)).
  78. RegisterEncoder(tCoreDocument, ValueEncoderFunc(dve.CoreDocumentEncodeValue)).
  79. RegisterEncoder(tCodeWithScope, ValueEncoderFunc(dve.CodeWithScopeEncodeValue)).
  80. RegisterDefaultEncoder(reflect.Bool, ValueEncoderFunc(dve.BooleanEncodeValue)).
  81. RegisterDefaultEncoder(reflect.Int, ValueEncoderFunc(dve.IntEncodeValue)).
  82. RegisterDefaultEncoder(reflect.Int8, ValueEncoderFunc(dve.IntEncodeValue)).
  83. RegisterDefaultEncoder(reflect.Int16, ValueEncoderFunc(dve.IntEncodeValue)).
  84. RegisterDefaultEncoder(reflect.Int32, ValueEncoderFunc(dve.IntEncodeValue)).
  85. RegisterDefaultEncoder(reflect.Int64, ValueEncoderFunc(dve.IntEncodeValue)).
  86. RegisterDefaultEncoder(reflect.Uint, ValueEncoderFunc(dve.UintEncodeValue)).
  87. RegisterDefaultEncoder(reflect.Uint8, ValueEncoderFunc(dve.UintEncodeValue)).
  88. RegisterDefaultEncoder(reflect.Uint16, ValueEncoderFunc(dve.UintEncodeValue)).
  89. RegisterDefaultEncoder(reflect.Uint32, ValueEncoderFunc(dve.UintEncodeValue)).
  90. RegisterDefaultEncoder(reflect.Uint64, ValueEncoderFunc(dve.UintEncodeValue)).
  91. RegisterDefaultEncoder(reflect.Float32, ValueEncoderFunc(dve.FloatEncodeValue)).
  92. RegisterDefaultEncoder(reflect.Float64, ValueEncoderFunc(dve.FloatEncodeValue)).
  93. RegisterDefaultEncoder(reflect.Array, ValueEncoderFunc(dve.ArrayEncodeValue)).
  94. RegisterDefaultEncoder(reflect.Map, ValueEncoderFunc(dve.MapEncodeValue)).
  95. RegisterDefaultEncoder(reflect.Slice, ValueEncoderFunc(dve.SliceEncodeValue)).
  96. RegisterDefaultEncoder(reflect.String, ValueEncoderFunc(dve.StringEncodeValue)).
  97. RegisterDefaultEncoder(reflect.Struct, &StructCodec{cache: make(map[reflect.Type]*structDescription), parser: DefaultStructTagParser}).
  98. RegisterDefaultEncoder(reflect.Ptr, NewPointerCodec())
  99. }
  100. // BooleanEncodeValue is the ValueEncoderFunc for bool types.
  101. func (dve DefaultValueEncoders) BooleanEncodeValue(ectx EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  102. if !val.IsValid() || val.Kind() != reflect.Bool {
  103. return ValueEncoderError{Name: "BooleanEncodeValue", Kinds: []reflect.Kind{reflect.Bool}, Received: val}
  104. }
  105. return vw.WriteBoolean(val.Bool())
  106. }
  107. func fitsIn32Bits(i int64) bool {
  108. return math.MinInt32 <= i && i <= math.MaxInt32
  109. }
  110. // IntEncodeValue is the ValueEncoderFunc for int types.
  111. func (dve DefaultValueEncoders) IntEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  112. switch val.Kind() {
  113. case reflect.Int8, reflect.Int16, reflect.Int32:
  114. return vw.WriteInt32(int32(val.Int()))
  115. case reflect.Int:
  116. i64 := val.Int()
  117. if fitsIn32Bits(i64) {
  118. return vw.WriteInt32(int32(i64))
  119. }
  120. return vw.WriteInt64(i64)
  121. case reflect.Int64:
  122. i64 := val.Int()
  123. if ec.MinSize && fitsIn32Bits(i64) {
  124. return vw.WriteInt32(int32(i64))
  125. }
  126. return vw.WriteInt64(i64)
  127. }
  128. return ValueEncoderError{
  129. Name: "IntEncodeValue",
  130. Kinds: []reflect.Kind{reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int},
  131. Received: val,
  132. }
  133. }
  134. // UintEncodeValue is the ValueEncoderFunc for uint types.
  135. func (dve DefaultValueEncoders) UintEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  136. switch val.Kind() {
  137. case reflect.Uint8, reflect.Uint16:
  138. return vw.WriteInt32(int32(val.Uint()))
  139. case reflect.Uint, reflect.Uint32, reflect.Uint64:
  140. u64 := val.Uint()
  141. if ec.MinSize && u64 <= math.MaxInt32 {
  142. return vw.WriteInt32(int32(u64))
  143. }
  144. if u64 > math.MaxInt64 {
  145. return fmt.Errorf("%d overflows int64", u64)
  146. }
  147. return vw.WriteInt64(int64(u64))
  148. }
  149. return ValueEncoderError{
  150. Name: "UintEncodeValue",
  151. Kinds: []reflect.Kind{reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint},
  152. Received: val,
  153. }
  154. }
  155. // FloatEncodeValue is the ValueEncoderFunc for float types.
  156. func (dve DefaultValueEncoders) FloatEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  157. switch val.Kind() {
  158. case reflect.Float32, reflect.Float64:
  159. return vw.WriteDouble(val.Float())
  160. }
  161. return ValueEncoderError{Name: "FloatEncodeValue", Kinds: []reflect.Kind{reflect.Float32, reflect.Float64}, Received: val}
  162. }
  163. // StringEncodeValue is the ValueEncoderFunc for string types.
  164. func (dve DefaultValueEncoders) StringEncodeValue(ectx EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  165. if val.Kind() != reflect.String {
  166. return ValueEncoderError{
  167. Name: "StringEncodeValue",
  168. Kinds: []reflect.Kind{reflect.String},
  169. Received: val,
  170. }
  171. }
  172. return vw.WriteString(val.String())
  173. }
  174. // ObjectIDEncodeValue is the ValueEncoderFunc for primitive.ObjectID.
  175. func (dve DefaultValueEncoders) ObjectIDEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  176. if !val.IsValid() || val.Type() != tOID {
  177. return ValueEncoderError{Name: "ObjectIDEncodeValue", Types: []reflect.Type{tOID}, Received: val}
  178. }
  179. return vw.WriteObjectID(val.Interface().(primitive.ObjectID))
  180. }
  181. // Decimal128EncodeValue is the ValueEncoderFunc for primitive.Decimal128.
  182. func (dve DefaultValueEncoders) Decimal128EncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  183. if !val.IsValid() || val.Type() != tDecimal {
  184. return ValueEncoderError{Name: "Decimal128EncodeValue", Types: []reflect.Type{tDecimal}, Received: val}
  185. }
  186. return vw.WriteDecimal128(val.Interface().(primitive.Decimal128))
  187. }
  188. // JSONNumberEncodeValue is the ValueEncoderFunc for json.Number.
  189. func (dve DefaultValueEncoders) JSONNumberEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  190. if !val.IsValid() || val.Type() != tJSONNumber {
  191. return ValueEncoderError{Name: "JSONNumberEncodeValue", Types: []reflect.Type{tJSONNumber}, Received: val}
  192. }
  193. jsnum := val.Interface().(json.Number)
  194. // Attempt int first, then float64
  195. if i64, err := jsnum.Int64(); err == nil {
  196. return dve.IntEncodeValue(ec, vw, reflect.ValueOf(i64))
  197. }
  198. f64, err := jsnum.Float64()
  199. if err != nil {
  200. return err
  201. }
  202. return dve.FloatEncodeValue(ec, vw, reflect.ValueOf(f64))
  203. }
  204. // URLEncodeValue is the ValueEncoderFunc for url.URL.
  205. func (dve DefaultValueEncoders) URLEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  206. if !val.IsValid() || val.Type() != tURL {
  207. return ValueEncoderError{Name: "URLEncodeValue", Types: []reflect.Type{tURL}, Received: val}
  208. }
  209. u := val.Interface().(url.URL)
  210. return vw.WriteString(u.String())
  211. }
  212. // TimeEncodeValue is the ValueEncoderFunc for time.TIme.
  213. func (dve DefaultValueEncoders) TimeEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  214. if !val.IsValid() || val.Type() != tTime {
  215. return ValueEncoderError{Name: "TimeEncodeValue", Types: []reflect.Type{tTime}, Received: val}
  216. }
  217. tt := val.Interface().(time.Time)
  218. return vw.WriteDateTime(tt.Unix()*1000 + int64(tt.Nanosecond()/1e6))
  219. }
  220. // ByteSliceEncodeValue is the ValueEncoderFunc for []byte.
  221. func (dve DefaultValueEncoders) ByteSliceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  222. if !val.IsValid() || val.Type() != tByteSlice {
  223. return ValueEncoderError{Name: "ByteSliceEncodeValue", Types: []reflect.Type{tByteSlice}, Received: val}
  224. }
  225. if val.IsNil() {
  226. return vw.WriteNull()
  227. }
  228. return vw.WriteBinary(val.Interface().([]byte))
  229. }
  230. // MapEncodeValue is the ValueEncoderFunc for map[string]* types.
  231. func (dve DefaultValueEncoders) MapEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  232. if !val.IsValid() || val.Kind() != reflect.Map || val.Type().Key().Kind() != reflect.String {
  233. return ValueEncoderError{Name: "MapEncodeValue", Kinds: []reflect.Kind{reflect.Map}, Received: val}
  234. }
  235. if val.IsNil() {
  236. // If we have a nill map but we can't WriteNull, that means we're probably trying to encode
  237. // to a TopLevel document. We can't currently tell if this is what actually happened, but if
  238. // there's a deeper underlying problem, the error will also be returned from WriteDocument,
  239. // so just continue. The operations on a map reflection value are valid, so we can call
  240. // MapKeys within mapEncodeValue without a problem.
  241. err := vw.WriteNull()
  242. if err == nil {
  243. return nil
  244. }
  245. }
  246. dw, err := vw.WriteDocument()
  247. if err != nil {
  248. return err
  249. }
  250. return dve.mapEncodeValue(ec, dw, val, nil)
  251. }
  252. // mapEncodeValue handles encoding of the values of a map. The collisionFn returns
  253. // true if the provided key exists, this is mainly used for inline maps in the
  254. // struct codec.
  255. func (dve DefaultValueEncoders) mapEncodeValue(ec EncodeContext, dw bsonrw.DocumentWriter, val reflect.Value, collisionFn func(string) bool) error {
  256. encoder, err := ec.LookupEncoder(val.Type().Elem())
  257. if err != nil {
  258. return err
  259. }
  260. keys := val.MapKeys()
  261. for _, key := range keys {
  262. if collisionFn != nil && collisionFn(key.String()) {
  263. return fmt.Errorf("Key %s of inlined map conflicts with a struct field name", key)
  264. }
  265. vw, err := dw.WriteDocumentElement(key.String())
  266. if err != nil {
  267. return err
  268. }
  269. if enc, ok := encoder.(ValueEncoder); ok {
  270. err = enc.EncodeValue(ec, vw, val.MapIndex(key))
  271. if err != nil {
  272. return err
  273. }
  274. continue
  275. }
  276. err = encoder.EncodeValue(ec, vw, val.MapIndex(key))
  277. if err != nil {
  278. return err
  279. }
  280. }
  281. return dw.WriteDocumentEnd()
  282. }
  283. // ArrayEncodeValue is the ValueEncoderFunc for array types.
  284. func (dve DefaultValueEncoders) ArrayEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  285. if !val.IsValid() || val.Kind() != reflect.Array {
  286. return ValueEncoderError{Name: "ArrayEncodeValue", Kinds: []reflect.Kind{reflect.Array}, Received: val}
  287. }
  288. // If we have a []primitive.E we want to treat it as a document instead of as an array.
  289. if val.Type().Elem() == tE {
  290. dw, err := vw.WriteDocument()
  291. if err != nil {
  292. return err
  293. }
  294. for idx := 0; idx < val.Len(); idx++ {
  295. e := val.Index(idx).Interface().(primitive.E)
  296. err = encodeElement(ec, dw, e)
  297. if err != nil {
  298. return err
  299. }
  300. }
  301. return dw.WriteDocumentEnd()
  302. }
  303. aw, err := vw.WriteArray()
  304. if err != nil {
  305. return err
  306. }
  307. encoder, err := ec.LookupEncoder(val.Type().Elem())
  308. if err != nil {
  309. return err
  310. }
  311. for idx := 0; idx < val.Len(); idx++ {
  312. vw, err := aw.WriteArrayElement()
  313. if err != nil {
  314. return err
  315. }
  316. err = encoder.EncodeValue(ec, vw, val.Index(idx))
  317. if err != nil {
  318. return err
  319. }
  320. }
  321. return aw.WriteArrayEnd()
  322. }
  323. // SliceEncodeValue is the ValueEncoderFunc for slice types.
  324. func (dve DefaultValueEncoders) SliceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  325. if !val.IsValid() || val.Kind() != reflect.Slice {
  326. return ValueEncoderError{Name: "SliceEncodeValue", Kinds: []reflect.Kind{reflect.Slice}, Received: val}
  327. }
  328. if val.IsNil() {
  329. return vw.WriteNull()
  330. }
  331. // If we have a []primitive.E we want to treat it as a document instead of as an array.
  332. if val.Type().ConvertibleTo(tD) {
  333. d := val.Convert(tD).Interface().(primitive.D)
  334. dw, err := vw.WriteDocument()
  335. if err != nil {
  336. return err
  337. }
  338. for _, e := range d {
  339. err = encodeElement(ec, dw, e)
  340. if err != nil {
  341. return err
  342. }
  343. }
  344. return dw.WriteDocumentEnd()
  345. }
  346. aw, err := vw.WriteArray()
  347. if err != nil {
  348. return err
  349. }
  350. encoder, err := ec.LookupEncoder(val.Type().Elem())
  351. if err != nil {
  352. return err
  353. }
  354. for idx := 0; idx < val.Len(); idx++ {
  355. vw, err := aw.WriteArrayElement()
  356. if err != nil {
  357. return err
  358. }
  359. err = encoder.EncodeValue(ec, vw, val.Index(idx))
  360. if err != nil {
  361. return err
  362. }
  363. }
  364. return aw.WriteArrayEnd()
  365. }
  366. // EmptyInterfaceEncodeValue is the ValueEncoderFunc for interface{}.
  367. func (dve DefaultValueEncoders) EmptyInterfaceEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  368. if !val.IsValid() || val.Type() != tEmpty {
  369. return ValueEncoderError{Name: "EmptyInterfaceEncodeValue", Types: []reflect.Type{tEmpty}, Received: val}
  370. }
  371. if val.IsNil() {
  372. return vw.WriteNull()
  373. }
  374. encoder, err := ec.LookupEncoder(val.Elem().Type())
  375. if err != nil {
  376. return err
  377. }
  378. return encoder.EncodeValue(ec, vw, val.Elem())
  379. }
  380. // ValueMarshalerEncodeValue is the ValueEncoderFunc for ValueMarshaler implementations.
  381. func (dve DefaultValueEncoders) ValueMarshalerEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  382. if !val.IsValid() || !val.Type().Implements(tValueMarshaler) {
  383. return ValueEncoderError{Name: "ValueMarshalerEncodeValue", Types: []reflect.Type{tValueMarshaler}, Received: val}
  384. }
  385. fn := val.Convert(tValueMarshaler).MethodByName("MarshalBSONValue")
  386. returns := fn.Call(nil)
  387. if !returns[2].IsNil() {
  388. return returns[2].Interface().(error)
  389. }
  390. t, data := returns[0].Interface().(bsontype.Type), returns[1].Interface().([]byte)
  391. return bsonrw.Copier{}.CopyValueFromBytes(vw, t, data)
  392. }
  393. // MarshalerEncodeValue is the ValueEncoderFunc for Marshaler implementations.
  394. func (dve DefaultValueEncoders) MarshalerEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  395. if !val.IsValid() || !val.Type().Implements(tMarshaler) {
  396. return ValueEncoderError{Name: "MarshalerEncodeValue", Types: []reflect.Type{tMarshaler}, Received: val}
  397. }
  398. fn := val.Convert(tMarshaler).MethodByName("MarshalBSON")
  399. returns := fn.Call(nil)
  400. if !returns[1].IsNil() {
  401. return returns[1].Interface().(error)
  402. }
  403. data := returns[0].Interface().([]byte)
  404. return bsonrw.Copier{}.CopyValueFromBytes(vw, bsontype.EmbeddedDocument, data)
  405. }
  406. // ProxyEncodeValue is the ValueEncoderFunc for Proxy implementations.
  407. func (dve DefaultValueEncoders) ProxyEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  408. if !val.IsValid() || !val.Type().Implements(tProxy) {
  409. return ValueEncoderError{Name: "ProxyEncodeValue", Types: []reflect.Type{tProxy}, Received: val}
  410. }
  411. fn := val.Convert(tProxy).MethodByName("ProxyBSON")
  412. returns := fn.Call(nil)
  413. if !returns[1].IsNil() {
  414. return returns[1].Interface().(error)
  415. }
  416. data := returns[0]
  417. var encoder ValueEncoder
  418. var err error
  419. if data.Elem().IsValid() {
  420. encoder, err = ec.LookupEncoder(data.Elem().Type())
  421. } else {
  422. encoder, err = ec.LookupEncoder(nil)
  423. }
  424. if err != nil {
  425. return err
  426. }
  427. return encoder.EncodeValue(ec, vw, data.Elem())
  428. }
  429. // JavaScriptEncodeValue is the ValueEncoderFunc for the primitive.JavaScript type.
  430. func (DefaultValueEncoders) JavaScriptEncodeValue(ectx EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  431. if !val.IsValid() || val.Type() != tJavaScript {
  432. return ValueEncoderError{Name: "JavaScriptEncodeValue", Types: []reflect.Type{tJavaScript}, Received: val}
  433. }
  434. return vw.WriteJavascript(val.String())
  435. }
  436. // SymbolEncodeValue is the ValueEncoderFunc for the primitive.Symbol type.
  437. func (DefaultValueEncoders) SymbolEncodeValue(ectx EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  438. if !val.IsValid() || val.Type() != tSymbol {
  439. return ValueEncoderError{Name: "SymbolEncodeValue", Types: []reflect.Type{tSymbol}, Received: val}
  440. }
  441. return vw.WriteSymbol(val.String())
  442. }
  443. // BinaryEncodeValue is the ValueEncoderFunc for Binary.
  444. func (DefaultValueEncoders) BinaryEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  445. if !val.IsValid() || val.Type() != tBinary {
  446. return ValueEncoderError{Name: "BinaryEncodeValue", Types: []reflect.Type{tBinary}, Received: val}
  447. }
  448. b := val.Interface().(primitive.Binary)
  449. return vw.WriteBinaryWithSubtype(b.Data, b.Subtype)
  450. }
  451. // UndefinedEncodeValue is the ValueEncoderFunc for Undefined.
  452. func (DefaultValueEncoders) UndefinedEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  453. if !val.IsValid() || val.Type() != tUndefined {
  454. return ValueEncoderError{Name: "UndefinedEncodeValue", Types: []reflect.Type{tUndefined}, Received: val}
  455. }
  456. return vw.WriteUndefined()
  457. }
  458. // DateTimeEncodeValue is the ValueEncoderFunc for DateTime.
  459. func (DefaultValueEncoders) DateTimeEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  460. if !val.IsValid() || val.Type() != tDateTime {
  461. return ValueEncoderError{Name: "DateTimeEncodeValue", Types: []reflect.Type{tDateTime}, Received: val}
  462. }
  463. return vw.WriteDateTime(val.Int())
  464. }
  465. // NullEncodeValue is the ValueEncoderFunc for Null.
  466. func (DefaultValueEncoders) NullEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  467. if !val.IsValid() || val.Type() != tNull {
  468. return ValueEncoderError{Name: "NullEncodeValue", Types: []reflect.Type{tNull}, Received: val}
  469. }
  470. return vw.WriteNull()
  471. }
  472. // RegexEncodeValue is the ValueEncoderFunc for Regex.
  473. func (DefaultValueEncoders) RegexEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  474. if !val.IsValid() || val.Type() != tRegex {
  475. return ValueEncoderError{Name: "RegexEncodeValue", Types: []reflect.Type{tRegex}, Received: val}
  476. }
  477. regex := val.Interface().(primitive.Regex)
  478. return vw.WriteRegex(regex.Pattern, regex.Options)
  479. }
  480. // DBPointerEncodeValue is the ValueEncoderFunc for DBPointer.
  481. func (DefaultValueEncoders) DBPointerEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  482. if !val.IsValid() || val.Type() != tDBPointer {
  483. return ValueEncoderError{Name: "DBPointerEncodeValue", Types: []reflect.Type{tDBPointer}, Received: val}
  484. }
  485. dbp := val.Interface().(primitive.DBPointer)
  486. return vw.WriteDBPointer(dbp.DB, dbp.Pointer)
  487. }
  488. // TimestampEncodeValue is the ValueEncoderFunc for Timestamp.
  489. func (DefaultValueEncoders) TimestampEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  490. if !val.IsValid() || val.Type() != tTimestamp {
  491. return ValueEncoderError{Name: "TimestampEncodeValue", Types: []reflect.Type{tTimestamp}, Received: val}
  492. }
  493. ts := val.Interface().(primitive.Timestamp)
  494. return vw.WriteTimestamp(ts.T, ts.I)
  495. }
  496. // MinKeyEncodeValue is the ValueEncoderFunc for MinKey.
  497. func (DefaultValueEncoders) MinKeyEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  498. if !val.IsValid() || val.Type() != tMinKey {
  499. return ValueEncoderError{Name: "MinKeyEncodeValue", Types: []reflect.Type{tMinKey}, Received: val}
  500. }
  501. return vw.WriteMinKey()
  502. }
  503. // MaxKeyEncodeValue is the ValueEncoderFunc for MaxKey.
  504. func (DefaultValueEncoders) MaxKeyEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  505. if !val.IsValid() || val.Type() != tMaxKey {
  506. return ValueEncoderError{Name: "MaxKeyEncodeValue", Types: []reflect.Type{tMaxKey}, Received: val}
  507. }
  508. return vw.WriteMaxKey()
  509. }
  510. // CoreDocumentEncodeValue is the ValueEncoderFunc for bsoncore.Document.
  511. func (DefaultValueEncoders) CoreDocumentEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  512. if !val.IsValid() || val.Type() != tCoreDocument {
  513. return ValueEncoderError{Name: "CoreDocumentEncodeValue", Types: []reflect.Type{tCoreDocument}, Received: val}
  514. }
  515. cdoc := val.Interface().(bsoncore.Document)
  516. return bsonrw.Copier{}.CopyDocumentFromBytes(vw, cdoc)
  517. }
  518. // CodeWithScopeEncodeValue is the ValueEncoderFunc for CodeWithScope.
  519. func (dve DefaultValueEncoders) CodeWithScopeEncodeValue(ec EncodeContext, vw bsonrw.ValueWriter, val reflect.Value) error {
  520. if !val.IsValid() || val.Type() != tCodeWithScope {
  521. return ValueEncoderError{Name: "CodeWithScopeEncodeValue", Types: []reflect.Type{tCodeWithScope}, Received: val}
  522. }
  523. cws := val.Interface().(primitive.CodeWithScope)
  524. dw, err := vw.WriteCodeWithScope(string(cws.Code))
  525. if err != nil {
  526. return err
  527. }
  528. sw := sliceWriterPool.Get().(*bsonrw.SliceWriter)
  529. defer sliceWriterPool.Put(sw)
  530. *sw = (*sw)[:0]
  531. scopeVW := bvwPool.Get(sw)
  532. defer bvwPool.Put(scopeVW)
  533. encoder, err := ec.LookupEncoder(reflect.TypeOf(cws.Scope))
  534. if err != nil {
  535. return err
  536. }
  537. err = encoder.EncodeValue(ec, scopeVW, reflect.ValueOf(cws.Scope))
  538. if err != nil {
  539. return err
  540. }
  541. err = bsonrw.Copier{}.CopyBytesToDocumentWriter(dw, *sw)
  542. if err != nil {
  543. return err
  544. }
  545. return dw.WriteDocumentEnd()
  546. }