github.com/RevenueMonster/sqlike@v1.0.6/jsonb/decoder.go (about) 1 package jsonb 2 3 import ( 4 "bytes" 5 "encoding/base64" 6 "encoding/json" 7 "errors" 8 "fmt" 9 "reflect" 10 "regexp" 11 "strconv" 12 "time" 13 14 "github.com/RevenueMonster/sqlike/reflext" 15 "golang.org/x/text/currency" 16 "golang.org/x/text/language" 17 ) 18 19 // date format : 20 var ( 21 ddmmyyyy = regexp.MustCompile(`^\d{4}\-\d{2}\-\d{2}$`) 22 ddmmyyyyhhmmss = regexp.MustCompile(`^\d{4}\-\d{2}\-\d{2}\s\d{2}\:\d{2}:\d{2}$`) 23 ) 24 25 // DefaultDecoder : 26 type DefaultDecoder struct { 27 registry *Registry 28 } 29 30 // DecodeByte : 31 func (dec DefaultDecoder) DecodeByte(r *Reader, v reflect.Value) error { 32 x, err := r.ReadRawString() 33 if err != nil { 34 return err 35 } 36 var b []byte 37 if x == null { 38 v.SetBytes(b) 39 return nil 40 } else if x == "" { 41 v.SetBytes(make([]byte, 0)) 42 return nil 43 } 44 b, err = base64.StdEncoding.DecodeString(x) 45 if err != nil { 46 return err 47 } 48 v.SetBytes(b) 49 return nil 50 } 51 52 // DecodeLanguage : 53 func (dec DefaultDecoder) DecodeLanguage(r *Reader, v reflect.Value) error { 54 str, err := r.ReadString() 55 if err != nil { 56 return err 57 } 58 if str == "" { 59 return nil 60 } 61 l, err := language.Parse(str) 62 if err != nil { 63 v.Set(reflect.ValueOf(language.Tag{})) 64 return err 65 } 66 v.Set(reflect.ValueOf(l)) 67 return nil 68 } 69 70 // DecodeCurrency : 71 func (dec DefaultDecoder) DecodeCurrency(r *Reader, v reflect.Value) error { 72 str, err := r.ReadString() 73 if err != nil { 74 return err 75 } 76 if str == "" { 77 v.Set(reflect.ValueOf(currency.Unit{})) 78 return nil 79 } 80 cur, err := currency.ParseISO(str) 81 if err != nil { 82 return err 83 } 84 v.Set(reflect.ValueOf(cur)) 85 return nil 86 } 87 88 // DecodeTime : 89 func (dec DefaultDecoder) DecodeTime(r *Reader, v reflect.Value) error { 90 b, err := r.ReadBytes() 91 if err != nil { 92 return err 93 } 94 str := string(b) 95 if str == null || str == `""` { 96 reflext.Set(v, reflect.ValueOf(time.Time{})) 97 return nil 98 } 99 if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' { 100 return errors.New("jsonb: invalid format of date") 101 } 102 str = string(b[1 : len(b)-1]) 103 var x time.Time 104 x, err = DecodeTime(str) 105 if err != nil { 106 return err 107 } 108 v.Set(reflect.ValueOf(x)) 109 return nil 110 } 111 112 // DecodeJSONRaw : 113 func (dec DefaultDecoder) DecodeJSONRaw(r *Reader, v reflect.Value) error { 114 b := new(bytes.Buffer) 115 if err := json.Compact(b, r.Bytes()); err != nil { 116 return err 117 } 118 v.SetBytes(b.Bytes()) 119 return nil 120 } 121 122 // DecodeJSONNumber : 123 func (dec DefaultDecoder) DecodeJSONNumber(r *Reader, v reflect.Value) error { 124 x, err := r.ReadNumber() 125 if err != nil { 126 return err 127 } 128 v.SetString(x.String()) 129 return nil 130 } 131 132 // DecodeString : 133 func (dec DefaultDecoder) DecodeString(r *Reader, v reflect.Value) error { 134 x, err := r.ReadString() 135 if err != nil { 136 return err 137 } 138 v.SetString(x) 139 return nil 140 } 141 142 // DecodeBool : 143 func (dec DefaultDecoder) DecodeBool(r *Reader, v reflect.Value) error { 144 x, err := r.ReadBoolean() 145 if err != nil { 146 return err 147 } 148 v.SetBool(x) 149 return nil 150 } 151 152 // DecodeInt : 153 func (dec DefaultDecoder) DecodeInt(quote bool) ValueDecoder { 154 return func(r *Reader, v reflect.Value) error { 155 var ( 156 str string 157 err error 158 ) 159 if quote { 160 str, err = r.ReadString() 161 if err != nil { 162 return err 163 } 164 } else { 165 num, err := r.ReadNumber() 166 if err != nil { 167 return err 168 } 169 str = num.String() 170 } 171 x, err := strconv.ParseInt(str, 10, 64) 172 if err != nil { 173 return err 174 } 175 if v.OverflowInt(x) { 176 return errors.New("integer overflow") 177 } 178 v.SetInt(x) 179 return nil 180 } 181 } 182 183 // DecodeUint : 184 func (dec DefaultDecoder) DecodeUint(quote bool) ValueDecoder { 185 return func(r *Reader, v reflect.Value) error { 186 var ( 187 str string 188 err error 189 ) 190 if quote { 191 str, err = r.ReadString() 192 if err != nil { 193 return err 194 } 195 } else { 196 num, err := r.ReadNumber() 197 if err != nil { 198 return err 199 } 200 str = num.String() 201 } 202 x, err := strconv.ParseUint(str, 10, 64) 203 if err != nil { 204 return err 205 } 206 if v.OverflowUint(x) { 207 return errors.New("unsigned integer overflow") 208 } 209 v.SetUint(x) 210 return nil 211 } 212 } 213 214 // DecodeFloat : 215 func (dec DefaultDecoder) DecodeFloat(r *Reader, v reflect.Value) error { 216 num, err := r.ReadNumber() 217 if err != nil { 218 return err 219 } 220 x, err := strconv.ParseFloat(num.String(), 64) 221 if err != nil { 222 return err 223 } 224 if v.OverflowFloat(x) { 225 return errors.New("jsonb: float overflow") 226 } 227 v.SetFloat(x) 228 return nil 229 } 230 231 // DecodePtr : 232 func (dec *DefaultDecoder) DecodePtr(r *Reader, v reflect.Value) error { 233 t := v.Type() 234 if r.IsNull() { 235 v.Set(reflect.Zero(t)) 236 return r.skipNull() 237 } 238 239 t = t.Elem() 240 decoder, err := dec.registry.LookupDecoder(t) 241 if err != nil { 242 return err 243 } 244 vv := reflect.New(t) 245 if err := decoder(r, vv.Elem()); err != nil { 246 return err 247 } 248 v.Set(vv) 249 return nil 250 } 251 252 // DecodeStruct : 253 func (dec *DefaultDecoder) DecodeStruct(r *Reader, v reflect.Value) error { 254 mapper := reflext.DefaultMapper 255 if r.IsNull() { 256 v.Set(reflect.Zero(v.Type())) 257 return r.skipNull() 258 } 259 260 return r.ReadObject(func(it *Reader, k string) error { 261 if it.IsNull() { 262 return nil 263 } 264 265 vv, exists := mapper.LookUpFieldByName(v, k) 266 if !exists { 267 return nil 268 } 269 270 decoder, err := dec.registry.LookupDecoder(vv.Type()) 271 if err != nil { 272 return err 273 } 274 275 return decoder(it, vv) 276 }) 277 } 278 279 // DecodeArray : 280 func (dec *DefaultDecoder) DecodeArray(r *Reader, v reflect.Value) error { 281 t := v.Type() 282 if r.IsNull() { 283 v.Set(reflect.Zero(t)) 284 return r.skipNull() 285 } 286 287 i, length := 0, v.Len() 288 t = t.Elem() 289 if err := r.ReadArray(func(it *Reader) error { 290 if i >= length { 291 return errors.New("jsonb: invalid array length") 292 } 293 vv := v.Index(i) 294 i++ 295 decoder, err := dec.registry.LookupDecoder(t) 296 if err != nil { 297 return err 298 } 299 return decoder(it, vv) 300 }); err != nil { 301 return err 302 } 303 return nil 304 } 305 306 // DecodeSlice : 307 func (dec *DefaultDecoder) DecodeSlice(r *Reader, v reflect.Value) error { 308 t := v.Type() 309 if r.IsNull() { 310 v.Set(reflect.Zero(t)) 311 return r.skipNull() 312 } 313 314 v.Set(reflect.MakeSlice(t, 0, 0)) 315 t = t.Elem() 316 return r.ReadArray(func(it *Reader) error { 317 v.Set(reflect.Append(v, reflext.Zero(t))) 318 vv := v.Index(v.Len() - 1) 319 decoder, err := dec.registry.LookupDecoder(t) 320 if err != nil { 321 return err 322 } 323 return decoder(it, vv) 324 }) 325 } 326 327 // DecodeMap : 328 func (dec *DefaultDecoder) DecodeMap(r *Reader, v reflect.Value) error { 329 if r.IsNull() { 330 v.Set(reflect.Zero(v.Type())) 331 return r.skipNull() 332 } 333 334 var ( 335 decodeKey ValueDecoder 336 err error 337 t = v.Type() 338 kind = t.Key().Kind() 339 ) 340 341 switch kind { 342 case reflect.String: 343 decodeKey = dec.registry.kindDecoders[reflect.String] 344 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 345 decodeKey = dec.DecodeInt(true) 346 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: 347 decodeKey = dec.DecodeUint(true) 348 default: 349 key := t.Key() 350 if key.Kind() != reflect.Ptr { 351 key = reflect.PtrTo(key) 352 } 353 // check if the map key is implements `encoding.TextUnmarshaler` 354 if !key.Implements(textUnmarshaler) { 355 return fmt.Errorf("jsonb: unsupported data type of map key, %q", t.Key().Kind()) 356 } 357 decodeKey = textUnmarshalerDecoder() 358 } 359 360 decodeValue, err := dec.registry.LookupDecoder(t.Elem()) 361 if err != nil { 362 return err 363 } 364 x := reflect.MakeMap(t) 365 if err := r.ReadObject(func(it *Reader, k string) error { 366 ki := reflext.Zero(t.Key()) 367 err = decodeKey(NewReader([]byte(strconv.Quote(k))), ki) 368 if err != nil { 369 return err 370 } 371 vi := reflext.Zero(t.Elem()) 372 err = decodeValue(it, vi) 373 if err != nil { 374 return err 375 } 376 x.SetMapIndex(ki, vi) 377 return nil 378 }); err != nil { 379 return err 380 } 381 v.Set(x) 382 return nil 383 } 384 385 // DecodeInterface : 386 func (dec DefaultDecoder) DecodeInterface(r *Reader, v reflect.Value) error { 387 x, err := r.ReadValue() 388 if err != nil { 389 return err 390 } 391 if x != nil { 392 v.Set(reflect.ValueOf(x)) 393 } 394 return nil 395 } 396 397 // DecodeTime : 398 func DecodeTime(str string) (t time.Time, err error) { 399 switch { 400 case ddmmyyyy.MatchString(str): 401 t, err = time.Parse("2006-01-02", str) 402 case ddmmyyyyhhmmss.MatchString(str): 403 t, err = time.Parse("2006-01-02 15:04:05", str) 404 default: 405 t, err = time.Parse(time.RFC3339Nano, str) 406 } 407 return 408 }