gopkg.in/rethinkdb/rethinkdb-go.v6@v6.2.2/encoding/decoder_types.go (about) 1 package encoding 2 3 import ( 4 "bytes" 5 "fmt" 6 "reflect" 7 "strconv" 8 ) 9 10 // newTypeDecoder constructs an decoderFunc for a type. 11 func newTypeDecoder(dt, st reflect.Type, blank bool) decoderFunc { 12 if reflect.PtrTo(dt).Implements(unmarshalerType) || 13 dt.Implements(unmarshalerType) { 14 return unmarshalerDecoder 15 } 16 17 if st.Kind() == reflect.Interface { 18 return newInterfaceAsTypeDecoder(blank) 19 } 20 21 switch dt.Kind() { 22 case reflect.Bool: 23 switch st.Kind() { 24 case reflect.Bool: 25 return boolAsBoolDecoder 26 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 27 return intAsBoolDecoder 28 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 29 return uintAsBoolDecoder 30 case reflect.Float32, reflect.Float64: 31 return floatAsBoolDecoder 32 case reflect.String: 33 return stringAsBoolDecoder 34 default: 35 return decodeTypeError 36 } 37 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 38 switch st.Kind() { 39 case reflect.Bool: 40 return boolAsIntDecoder 41 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 42 return intAsIntDecoder 43 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 44 return uintAsIntDecoder 45 case reflect.Float32, reflect.Float64: 46 return floatAsIntDecoder 47 case reflect.String: 48 return stringAsIntDecoder 49 default: 50 return decodeTypeError 51 } 52 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 53 switch st.Kind() { 54 case reflect.Bool: 55 return boolAsUintDecoder 56 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 57 return intAsUintDecoder 58 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 59 return uintAsUintDecoder 60 case reflect.Float32, reflect.Float64: 61 return floatAsUintDecoder 62 case reflect.String: 63 return stringAsUintDecoder 64 default: 65 return decodeTypeError 66 } 67 case reflect.Float32, reflect.Float64: 68 switch st.Kind() { 69 case reflect.Bool: 70 return boolAsFloatDecoder 71 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 72 return intAsFloatDecoder 73 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 74 return uintAsFloatDecoder 75 case reflect.Float32, reflect.Float64: 76 return floatAsFloatDecoder 77 case reflect.String: 78 return stringAsFloatDecoder 79 default: 80 return decodeTypeError 81 } 82 case reflect.String: 83 switch st.Kind() { 84 case reflect.Bool: 85 return boolAsStringDecoder 86 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 87 return intAsStringDecoder 88 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 89 return uintAsStringDecoder 90 case reflect.Float32, reflect.Float64: 91 return floatAsStringDecoder 92 case reflect.String: 93 return stringAsStringDecoder 94 default: 95 return decodeTypeError 96 } 97 case reflect.Interface: 98 if !st.AssignableTo(dt) { 99 return decodeTypeError 100 } 101 102 return interfaceDecoder 103 case reflect.Ptr: 104 return newPtrDecoder(dt, st, blank) 105 case reflect.Map: 106 if st.AssignableTo(dt) { 107 return interfaceDecoder 108 } 109 110 switch st.Kind() { 111 case reflect.Map: 112 return newMapAsMapDecoder(dt, st, blank) 113 default: 114 return decodeTypeError 115 } 116 case reflect.Struct: 117 if st.AssignableTo(dt) { 118 return interfaceDecoder 119 } 120 121 switch st.Kind() { 122 case reflect.Map: 123 if kind := st.Key().Kind(); kind != reflect.String && kind != reflect.Interface { 124 return newDecodeTypeError(fmt.Errorf("map needs string keys")) 125 } 126 127 return newMapAsStructDecoder(dt, st, blank) 128 default: 129 return decodeTypeError 130 } 131 case reflect.Slice: 132 if st.AssignableTo(dt) { 133 return interfaceDecoder 134 } 135 136 switch st.Kind() { 137 case reflect.Array, reflect.Slice: 138 return newSliceDecoder(dt, st) 139 default: 140 return decodeTypeError 141 } 142 case reflect.Array: 143 if st.AssignableTo(dt) { 144 return interfaceDecoder 145 } 146 147 switch st.Kind() { 148 case reflect.Array, reflect.Slice: 149 return newArrayDecoder(dt, st) 150 default: 151 return decodeTypeError 152 } 153 default: 154 return unsupportedTypeDecoder 155 } 156 } 157 158 func invalidValueDecoder(dv, sv reflect.Value) error { 159 dv.Set(reflect.Zero(dv.Type())) 160 return nil 161 } 162 163 func unsupportedTypeDecoder(dv, sv reflect.Value) error { 164 return &UnsupportedTypeError{dv.Type()} 165 } 166 167 func decodeTypeError(dv, sv reflect.Value) error { 168 return &DecodeTypeError{ 169 DestType: dv.Type(), 170 SrcType: sv.Type(), 171 } 172 } 173 174 func newDecodeTypeError(err error) decoderFunc { 175 return func(dv, sv reflect.Value) error { 176 return &DecodeTypeError{ 177 DestType: dv.Type(), 178 SrcType: sv.Type(), 179 Reason: err.Error(), 180 } 181 } 182 } 183 184 func interfaceDecoder(dv, sv reflect.Value) error { 185 dv.Set(sv) 186 return nil 187 } 188 189 func newInterfaceAsTypeDecoder(blank bool) decoderFunc { 190 return func(dv, sv reflect.Value) error { 191 if !sv.IsNil() { 192 dv = indirect(dv, false) 193 if blank { 194 dv.Set(reflect.Zero(dv.Type())) 195 } 196 return decodeValue(dv, sv.Elem(), blank) 197 } 198 return nil 199 } 200 } 201 202 type ptrDecoder struct { 203 elemDec decoderFunc 204 } 205 206 func (d *ptrDecoder) decode(dv, sv reflect.Value) error { 207 v := reflect.New(dv.Type().Elem()) 208 err := d.elemDec(v, sv) 209 dv.Set(v) 210 return err 211 } 212 213 func newPtrDecoder(dt, st reflect.Type, blank bool) decoderFunc { 214 dec := &ptrDecoder{typeDecoder(dt.Elem(), st, blank)} 215 216 return dec.decode 217 } 218 219 func unmarshalerDecoder(dv, sv reflect.Value) error { 220 // modeled off of https://golang.org/src/encoding/json/decode.go?#L325 221 if dv.Kind() != reflect.Ptr && dv.Type().Name() != "" && dv.CanAddr() { 222 dv = dv.Addr() 223 } 224 225 if dv.IsNil() { 226 dv.Set(reflect.New(dv.Type().Elem())) 227 } 228 229 u := dv.Interface().(Unmarshaler) 230 err := u.UnmarshalRQL(sv.Interface()) 231 if err != nil { 232 return &DecodeTypeError{dv.Type(), sv.Type(), err.Error()} 233 } 234 return nil 235 } 236 237 // Boolean decoders 238 239 func boolAsBoolDecoder(dv, sv reflect.Value) error { 240 dv.SetBool(sv.Bool()) 241 return nil 242 } 243 func boolAsIntDecoder(dv, sv reflect.Value) error { 244 if sv.Bool() { 245 dv.SetInt(1) 246 } else { 247 dv.SetInt(0) 248 } 249 return nil 250 } 251 func boolAsUintDecoder(dv, sv reflect.Value) error { 252 if sv.Bool() { 253 dv.SetUint(1) 254 } else { 255 dv.SetUint(0) 256 } 257 return nil 258 } 259 func boolAsFloatDecoder(dv, sv reflect.Value) error { 260 if sv.Bool() { 261 dv.SetFloat(1) 262 } else { 263 dv.SetFloat(0) 264 } 265 return nil 266 } 267 func boolAsStringDecoder(dv, sv reflect.Value) error { 268 if sv.Bool() { 269 dv.SetString("1") 270 } else { 271 dv.SetString("0") 272 } 273 return nil 274 } 275 276 // Int decoders 277 278 func intAsBoolDecoder(dv, sv reflect.Value) error { 279 dv.SetBool(sv.Int() != 0) 280 return nil 281 } 282 func intAsIntDecoder(dv, sv reflect.Value) error { 283 dv.SetInt(sv.Int()) 284 return nil 285 } 286 func intAsUintDecoder(dv, sv reflect.Value) error { 287 dv.SetUint(uint64(sv.Int())) 288 return nil 289 } 290 func intAsFloatDecoder(dv, sv reflect.Value) error { 291 dv.SetFloat(float64(sv.Int())) 292 return nil 293 } 294 func intAsStringDecoder(dv, sv reflect.Value) error { 295 dv.SetString(strconv.FormatInt(sv.Int(), 10)) 296 return nil 297 } 298 299 // Uint decoders 300 301 func uintAsBoolDecoder(dv, sv reflect.Value) error { 302 dv.SetBool(sv.Uint() != 0) 303 return nil 304 } 305 func uintAsIntDecoder(dv, sv reflect.Value) error { 306 dv.SetInt(int64(sv.Uint())) 307 return nil 308 } 309 func uintAsUintDecoder(dv, sv reflect.Value) error { 310 dv.SetUint(sv.Uint()) 311 return nil 312 } 313 func uintAsFloatDecoder(dv, sv reflect.Value) error { 314 dv.SetFloat(float64(sv.Uint())) 315 return nil 316 } 317 func uintAsStringDecoder(dv, sv reflect.Value) error { 318 dv.SetString(strconv.FormatUint(sv.Uint(), 10)) 319 return nil 320 } 321 322 // Float decoders 323 324 func floatAsBoolDecoder(dv, sv reflect.Value) error { 325 dv.SetBool(sv.Float() != 0) 326 return nil 327 } 328 func floatAsIntDecoder(dv, sv reflect.Value) error { 329 dv.SetInt(int64(sv.Float())) 330 return nil 331 } 332 func floatAsUintDecoder(dv, sv reflect.Value) error { 333 dv.SetUint(uint64(sv.Float())) 334 return nil 335 } 336 func floatAsFloatDecoder(dv, sv reflect.Value) error { 337 dv.SetFloat(float64(sv.Float())) 338 return nil 339 } 340 func floatAsStringDecoder(dv, sv reflect.Value) error { 341 dv.SetString(strconv.FormatFloat(sv.Float(), 'f', -1, 64)) 342 return nil 343 } 344 345 // String decoders 346 347 func stringAsBoolDecoder(dv, sv reflect.Value) error { 348 b, err := strconv.ParseBool(sv.String()) 349 if err == nil { 350 dv.SetBool(b) 351 } else if sv.String() == "" { 352 dv.SetBool(false) 353 } else { 354 return &DecodeTypeError{dv.Type(), sv.Type(), err.Error()} 355 } 356 return nil 357 } 358 func stringAsIntDecoder(dv, sv reflect.Value) error { 359 i, err := strconv.ParseInt(sv.String(), 0, dv.Type().Bits()) 360 if err == nil { 361 dv.SetInt(i) 362 } else { 363 return &DecodeTypeError{dv.Type(), sv.Type(), err.Error()} 364 } 365 return nil 366 } 367 func stringAsUintDecoder(dv, sv reflect.Value) error { 368 i, err := strconv.ParseUint(sv.String(), 0, dv.Type().Bits()) 369 if err == nil { 370 dv.SetUint(i) 371 } else { 372 return &DecodeTypeError{dv.Type(), sv.Type(), err.Error()} 373 } 374 return nil 375 } 376 func stringAsFloatDecoder(dv, sv reflect.Value) error { 377 f, err := strconv.ParseFloat(sv.String(), dv.Type().Bits()) 378 if err == nil { 379 dv.SetFloat(f) 380 } else { 381 return &DecodeTypeError{dv.Type(), sv.Type(), err.Error()} 382 } 383 return nil 384 } 385 func stringAsStringDecoder(dv, sv reflect.Value) error { 386 dv.SetString(sv.String()) 387 return nil 388 } 389 390 // Slice/Array decoder 391 392 type sliceDecoder struct { 393 arrayDec decoderFunc 394 } 395 396 func (d *sliceDecoder) decode(dv, sv reflect.Value) error { 397 if dv.Kind() == reflect.Slice { 398 dv.Set(reflect.MakeSlice(dv.Type(), dv.Len(), dv.Cap())) 399 } 400 401 if !sv.IsNil() { 402 err := d.arrayDec(dv, sv) 403 if err != nil { 404 return err 405 } 406 } 407 return nil 408 } 409 410 func newSliceDecoder(dt, st reflect.Type) decoderFunc { 411 dec := &sliceDecoder{newArrayDecoder(dt, st)} 412 return dec.decode 413 } 414 415 type arrayDecoder struct { 416 elemDec decoderFunc 417 } 418 419 func (d *arrayDecoder) decode(dv, sv reflect.Value) error { 420 // Iterate through the slice/array and decode each element before adding it 421 // to the dest slice/array 422 i := 0 423 for i < sv.Len() { 424 if dv.Kind() == reflect.Slice { 425 // Get element of array, growing if necessary. 426 if i >= dv.Cap() { 427 newcap := dv.Cap() + dv.Cap()/2 428 if newcap < 4 { 429 newcap = 4 430 } 431 newdv := reflect.MakeSlice(dv.Type(), dv.Len(), newcap) 432 reflect.Copy(newdv, dv) 433 dv.Set(newdv) 434 } 435 if i >= dv.Len() { 436 dv.SetLen(i + 1) 437 } 438 } 439 440 if i < dv.Len() { 441 // Decode into element. 442 err := d.elemDec(dv.Index(i), sv.Index(i)) 443 if err != nil { 444 return err 445 } 446 } 447 448 i++ 449 } 450 451 // Ensure that the destination is the correct size 452 if i < dv.Len() { 453 if dv.Kind() == reflect.Array { 454 // Array. Zero the rest. 455 z := reflect.Zero(dv.Type().Elem()) 456 for ; i < dv.Len(); i++ { 457 dv.Index(i).Set(z) 458 } 459 } else { 460 dv.SetLen(i) 461 } 462 } 463 return nil 464 } 465 466 func newArrayDecoder(dt, st reflect.Type) decoderFunc { 467 dec := &arrayDecoder{typeDecoder(dt.Elem(), st.Elem(), true)} 468 return dec.decode 469 } 470 471 // Map decoder 472 473 type mapAsMapDecoder struct { 474 keyDec, elemDec decoderFunc 475 blank bool 476 } 477 478 func (d *mapAsMapDecoder) decode(dv, sv reflect.Value) error { 479 dt := dv.Type() 480 if d.blank { 481 dv.Set(reflect.MakeMap(reflect.MapOf(dt.Key(), dt.Elem()))) 482 } 483 484 var mapKey reflect.Value 485 var mapElem reflect.Value 486 487 keyType := dv.Type().Key() 488 elemType := dv.Type().Elem() 489 490 for _, sElemKey := range sv.MapKeys() { 491 var dElemKey reflect.Value 492 var dElemVal reflect.Value 493 494 if !mapKey.IsValid() { 495 mapKey = reflect.New(keyType).Elem() 496 } else { 497 mapKey.Set(reflect.Zero(keyType)) 498 } 499 dElemKey = mapKey 500 501 if !mapElem.IsValid() { 502 mapElem = reflect.New(elemType).Elem() 503 } else { 504 mapElem.Set(reflect.Zero(elemType)) 505 } 506 dElemVal = mapElem 507 508 err := d.keyDec(dElemKey, sElemKey) 509 if err != nil { 510 return err 511 } 512 err = d.elemDec(dElemVal, sv.MapIndex(sElemKey)) 513 if err != nil { 514 return err 515 } 516 517 dv.SetMapIndex(dElemKey, dElemVal) 518 } 519 return nil 520 } 521 522 func newMapAsMapDecoder(dt, st reflect.Type, blank bool) decoderFunc { 523 d := &mapAsMapDecoder{typeDecoder(dt.Key(), st.Key(), blank), typeDecoder(dt.Elem(), st.Elem(), blank), blank} 524 return d.decode 525 } 526 527 type mapAsStructDecoder struct { 528 fields []field 529 fieldDecs []decoderFunc 530 blank bool 531 } 532 533 func (d *mapAsStructDecoder) decode(dv, sv reflect.Value) error { 534 for _, kv := range sv.MapKeys() { 535 var f *field 536 var compoundFields = []*field{} 537 var fieldDec decoderFunc 538 key := []byte(kv.String()) 539 for i := range d.fields { 540 ff := &d.fields[i] 541 ffd := d.fieldDecs[i] 542 543 if bytes.Equal(ff.nameBytes, key) { 544 f = ff 545 fieldDec = ffd 546 if ff.compound { 547 compoundFields = append(compoundFields, ff) 548 } 549 } 550 if f == nil && ff.equalFold(ff.nameBytes, key) { 551 f = ff 552 fieldDec = ffd 553 if ff.compound { 554 compoundFields = append(compoundFields, ff) 555 } 556 } 557 } 558 559 if len(compoundFields) > 0 { 560 for _, compoundField := range compoundFields { 561 dElemVal := fieldByIndex(dv, compoundField.index) 562 sElemVal := sv.MapIndex(kv) 563 564 if sElemVal.Kind() == reflect.Interface { 565 sElemVal = sElemVal.Elem() 566 } 567 sElemVal = sElemVal.Index(compoundField.compoundIndex) 568 fieldDec = typeDecoder(dElemVal.Type(), sElemVal.Type(), d.blank) 569 570 if !sElemVal.IsValid() || !dElemVal.CanSet() { 571 continue 572 } 573 574 err := fieldDec(dElemVal, sElemVal) 575 if err != nil { 576 return err 577 } 578 } 579 } else if f != nil { 580 dElemVal := fieldByIndex(dv, f.index) 581 sElemVal := sv.MapIndex(kv) 582 583 if !sElemVal.IsValid() || !dElemVal.CanSet() { 584 continue 585 } 586 587 err := fieldDec(dElemVal, sElemVal) 588 if err != nil { 589 return err 590 } 591 } 592 } 593 return nil 594 } 595 596 func newMapAsStructDecoder(dt, st reflect.Type, blank bool) decoderFunc { 597 fields := cachedTypeFields(dt) 598 se := &mapAsStructDecoder{ 599 fields: fields, 600 fieldDecs: make([]decoderFunc, len(fields)), 601 blank: blank, 602 } 603 for i, f := range fields { 604 se.fieldDecs[i] = typeDecoder(typeByIndex(dt, f.index), st.Elem(), blank) 605 } 606 return se.decode 607 }