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  }