github.com/mdaxf/iac@v0.0.0-20240519030858-58a061660378/vendor_skip/go.mongodb.org/mongo-driver/bson/unmarshal.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 12 "go.mongodb.org/mongo-driver/bson/bsoncodec" 13 "go.mongodb.org/mongo-driver/bson/bsonrw" 14 "go.mongodb.org/mongo-driver/bson/bsontype" 15 ) 16 17 // Unmarshaler is the interface implemented by types that can unmarshal a BSON 18 // document representation of themselves. The input can be assumed to be a valid 19 // encoding of a BSON document. UnmarshalBSON must copy the JSON data if it 20 // wishes to retain the data after returning. 21 // 22 // Unmarshaler is only used to unmarshal full BSON documents. To create custom 23 // BSON unmarshaling behavior for individual values in a BSON document, 24 // implement the ValueUnmarshaler interface instead. 25 type Unmarshaler interface { 26 UnmarshalBSON([]byte) error 27 } 28 29 // ValueUnmarshaler is the interface implemented by types that can unmarshal a 30 // BSON value representation of themselves. The input can be assumed to be a 31 // valid encoding of a BSON value. UnmarshalBSONValue must copy the BSON value 32 // bytes if it wishes to retain the data after returning. 33 // 34 // ValueUnmarshaler is only used to unmarshal individual values in a BSON 35 // document. To create custom BSON unmarshaling behavior for an entire BSON 36 // document, implement the Unmarshaler interface instead. 37 type ValueUnmarshaler interface { 38 UnmarshalBSONValue(bsontype.Type, []byte) error 39 } 40 41 // Unmarshal parses the BSON-encoded data and stores the result in the value 42 // pointed to by val. If val is nil or not a pointer, Unmarshal returns 43 // InvalidUnmarshalError. 44 func Unmarshal(data []byte, val interface{}) error { 45 return UnmarshalWithRegistry(DefaultRegistry, data, val) 46 } 47 48 // UnmarshalWithRegistry parses the BSON-encoded data using Registry r and 49 // stores the result in the value pointed to by val. If val is nil or not 50 // a pointer, UnmarshalWithRegistry returns InvalidUnmarshalError. 51 // 52 // Deprecated: Use [NewDecoder] and specify the Registry by calling [Decoder.SetRegistry] instead: 53 // 54 // dec, err := bson.NewDecoder(bsonrw.NewBSONDocumentReader(data)) 55 // if err != nil { 56 // panic(err) 57 // } 58 // dec.SetRegistry(reg) 59 // 60 // See [Decoder] for more examples. 61 func UnmarshalWithRegistry(r *bsoncodec.Registry, data []byte, val interface{}) error { 62 vr := bsonrw.NewBSONDocumentReader(data) 63 return unmarshalFromReader(bsoncodec.DecodeContext{Registry: r}, vr, val) 64 } 65 66 // UnmarshalWithContext parses the BSON-encoded data using DecodeContext dc and 67 // stores the result in the value pointed to by val. If val is nil or not 68 // a pointer, UnmarshalWithRegistry returns InvalidUnmarshalError. 69 // 70 // Deprecated: Use [NewDecoder] and use the Decoder configuration methods to set the desired unmarshal 71 // behavior instead: 72 // 73 // dec, err := bson.NewDecoder(bsonrw.NewBSONDocumentReader(data)) 74 // if err != nil { 75 // panic(err) 76 // } 77 // dec.DefaultDocumentM() 78 // 79 // See [Decoder] for more examples. 80 func UnmarshalWithContext(dc bsoncodec.DecodeContext, data []byte, val interface{}) error { 81 vr := bsonrw.NewBSONDocumentReader(data) 82 return unmarshalFromReader(dc, vr, val) 83 } 84 85 // UnmarshalValue parses the BSON value of type t with bson.DefaultRegistry and 86 // stores the result in the value pointed to by val. If val is nil or not a pointer, 87 // UnmarshalValue returns an error. 88 func UnmarshalValue(t bsontype.Type, data []byte, val interface{}) error { 89 return UnmarshalValueWithRegistry(DefaultRegistry, t, data, val) 90 } 91 92 // UnmarshalValueWithRegistry parses the BSON value of type t with registry r and 93 // stores the result in the value pointed to by val. If val is nil or not a pointer, 94 // UnmarshalValue returns an error. 95 // 96 // Deprecated: Using a custom registry to unmarshal individual BSON values will not be supported in 97 // Go Driver 2.0. 98 func UnmarshalValueWithRegistry(r *bsoncodec.Registry, t bsontype.Type, data []byte, val interface{}) error { 99 vr := bsonrw.NewBSONValueReader(t, data) 100 return unmarshalFromReader(bsoncodec.DecodeContext{Registry: r}, vr, val) 101 } 102 103 // UnmarshalExtJSON parses the extended JSON-encoded data and stores the result 104 // in the value pointed to by val. If val is nil or not a pointer, Unmarshal 105 // returns InvalidUnmarshalError. 106 func UnmarshalExtJSON(data []byte, canonical bool, val interface{}) error { 107 return UnmarshalExtJSONWithRegistry(DefaultRegistry, data, canonical, val) 108 } 109 110 // UnmarshalExtJSONWithRegistry parses the extended JSON-encoded data using 111 // Registry r and stores the result in the value pointed to by val. If val is 112 // nil or not a pointer, UnmarshalWithRegistry returns InvalidUnmarshalError. 113 // 114 // Deprecated: Use [NewDecoder] and specify the Registry by calling [Decoder.SetRegistry] instead: 115 // 116 // vr, err := bsonrw.NewExtJSONValueReader(bytes.NewReader(data), true) 117 // if err != nil { 118 // panic(err) 119 // } 120 // dec, err := bson.NewDecoder(vr) 121 // if err != nil { 122 // panic(err) 123 // } 124 // dec.SetRegistry(reg) 125 // 126 // See [Decoder] for more examples. 127 func UnmarshalExtJSONWithRegistry(r *bsoncodec.Registry, data []byte, canonical bool, val interface{}) error { 128 ejvr, err := bsonrw.NewExtJSONValueReader(bytes.NewReader(data), canonical) 129 if err != nil { 130 return err 131 } 132 133 return unmarshalFromReader(bsoncodec.DecodeContext{Registry: r}, ejvr, val) 134 } 135 136 // UnmarshalExtJSONWithContext parses the extended JSON-encoded data using 137 // DecodeContext dc and stores the result in the value pointed to by val. If val is 138 // nil or not a pointer, UnmarshalWithRegistry returns InvalidUnmarshalError. 139 // 140 // Deprecated: Use [NewDecoder] and use the Decoder configuration methods to set the desired unmarshal 141 // behavior instead: 142 // 143 // vr, err := bsonrw.NewExtJSONValueReader(bytes.NewReader(data), true) 144 // if err != nil { 145 // panic(err) 146 // } 147 // dec, err := bson.NewDecoder(vr) 148 // if err != nil { 149 // panic(err) 150 // } 151 // dec.DefaultDocumentM() 152 // 153 // See [Decoder] for more examples. 154 func UnmarshalExtJSONWithContext(dc bsoncodec.DecodeContext, data []byte, canonical bool, val interface{}) error { 155 ejvr, err := bsonrw.NewExtJSONValueReader(bytes.NewReader(data), canonical) 156 if err != nil { 157 return err 158 } 159 160 return unmarshalFromReader(dc, ejvr, val) 161 } 162 163 func unmarshalFromReader(dc bsoncodec.DecodeContext, vr bsonrw.ValueReader, val interface{}) error { 164 dec := decPool.Get().(*Decoder) 165 defer decPool.Put(dec) 166 167 err := dec.Reset(vr) 168 if err != nil { 169 return err 170 } 171 err = dec.SetContext(dc) 172 if err != nil { 173 return err 174 } 175 176 return dec.Decode(val) 177 }