func tryConvertGoToOdpsData()

in odps/data/data_conversion.go [52:123]


func tryConvertGoToOdpsData(v reflect.Value) (Data, error) {
	switch v.Kind() {
	case reflect.Bool:
		return Bool(v.Interface().(bool)), nil
	case reflect.Int8:
		return TinyInt(v.Interface().(int8)), nil
	case reflect.Int:
		return Int(v.Interface().(int)), nil
	case reflect.Int32:
		return Int(v.Interface().(int32)), nil
	case reflect.Int16:
		return SmallInt(v.Interface().(int16)), nil
	case reflect.Int64:
		return BigInt(v.Interface().(int64)), nil
	case reflect.Float32:
		return Float(v.Interface().(float32)), nil
	case reflect.Float64:
		return Double(v.Interface().(float64)), nil
	case reflect.String:
		s := String(v.Interface().(string))
		return s, nil
	case reflect.Array, reflect.Slice:
		arr := NewArray()
		for i, n := 0, v.Len(); i < n; i++ {
			elem, err := TryConvertGoToOdpsData(v.Index(i).Interface())
			if err != nil {
				return nil, err
			}

			arr.Append(elem)
		}

		return arr, nil
	case reflect.Map:
		m := NewMap()
		for _, k := range v.MapKeys() {
			key, err := TryConvertGoToOdpsData(k.Interface())
			if err != nil {
				return nil, err
			}

			value, err := TryConvertGoToOdpsData(v.MapIndex(k).Interface())
			if err != nil {
				return nil, err
			}

			m.Set(key, value)
		}

		return m, nil
	case reflect.Struct:
		s := NewStruct()
		t := v.Type()
		for i, n := 0, v.NumField(); i < n; i++ {
			fieldValue, err := TryConvertGoToOdpsData(v.Field(i).Interface())
			if err != nil {
				return nil, err
			}

			field := t.Field(i)
			fieldName := field.Tag.Get("odps")
			if fieldName == "" {
				fieldName = field.Name
			}
			s.SetField(fieldName, fieldValue)
		}

		return s, nil
	}

	return nil, errors.Errorf("Cannot convert data of type %s to odps data", v.Type().Name())
}