// v1 and v2 are known to have the same type. func equalAny(v1, v2 reflect.Value) bool { if v1.Type() == protoMessageType { m1, _ := v1.Interface().(Message) m2, _ := v2.Interface().(Message) return Equal(m1, m2) } switch v1.Kind() { case reflect.Bool: return v1.Bool() == v2.Bool() case reflect.Float32, reflect.Float64: return v1.Float() == v2.Float() case reflect.Int32, reflect.Int64: return v1.Int() == v2.Int() case reflect.Map: if v1.Len() != v2.Len() { return false } for _, key := range v1.MapKeys() { val2 := v2.MapIndex(key) if !val2.IsValid() { // This key was not found in the second map. return false } if !equalAny(v1.MapIndex(key), val2) { return false } } return true case reflect.Ptr: return equalAny(v1.Elem(), v2.Elem()) case reflect.Slice: if v1.Type().Elem().Kind() == reflect.Uint8 { // short circuit: []byte if v1.IsNil() != v2.IsNil() { return false } return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) } if v1.Len() != v2.Len() { return false } for i := 0; i < v1.Len(); i++ { if !equalAny(v1.Index(i), v2.Index(i)) { return false } } return true case reflect.String: return v1.Interface().(string) == v2.Interface().(string) case reflect.Struct: return equalStruct(v1, v2) case reflect.Uint32, reflect.Uint64: return v1.Uint() == v2.Uint() } // unknown type, so not a protocol buffer log.Printf("proto: don't know how to compare %v", v1) return false }
func (p *printer) marshalSimple(typ reflect.Type, val reflect.Value) (string, []byte, error) { switch val.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return strconv.FormatInt(val.Int(), 10), nil, nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: return strconv.FormatUint(val.Uint(), 10), nil, nil case reflect.Float32, reflect.Float64: return strconv.FormatFloat(val.Float(), 'g', -1, val.Type().Bits()), nil, nil case reflect.String: return val.String(), nil, nil case reflect.Bool: return strconv.FormatBool(val.Bool()), nil, nil case reflect.Array: if typ.Elem().Kind() != reflect.Uint8 { break } // [...]byte var bytes []byte if val.CanAddr() { bytes = val.Slice(0, val.Len()).Bytes() } else { bytes = make([]byte, val.Len()) reflect.Copy(reflect.ValueOf(bytes), val) } return "", bytes, nil case reflect.Slice: if typ.Elem().Kind() != reflect.Uint8 { break } // []byte return "", val.Bytes(), nil } return "", nil, &UnsupportedTypeError{typ} }
func ReturnWhenSet(a, k interface{}) interface{} { av, isNil := indirect(reflect.ValueOf(a)) if isNil { return "" } var avv reflect.Value switch av.Kind() { case reflect.Array, reflect.Slice: index, ok := k.(int) if ok && av.Len() > index { avv = av.Index(index) } case reflect.Map: kv := reflect.ValueOf(k) if kv.Type().AssignableTo(av.Type().Key()) { avv = av.MapIndex(kv) } } if avv.IsValid() { switch avv.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return avv.Int() case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: return avv.Uint() case reflect.Float32, reflect.Float64: return avv.Float() case reflect.String: return avv.String() } } return "" }
func plain_extract_value(name string, field reflect.Value) url.Values { values := make(url.Values) switch field.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: values.Add(name, strconv.FormatInt(field.Int(), 10)) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: values.Add(name, strconv.FormatUint(field.Uint(), 10)) case reflect.Bool: values.Add(name, strconv.FormatBool(field.Bool())) case reflect.Struct: values = merge(values, plain_extract_struct(field)) case reflect.Slice: for i := 0; i < field.Len(); i++ { sv := field.Index(i) values = merge(values, plain_extract_value(name, sv)) } case reflect.String: values.Add(name, field.String()) case reflect.Float32, reflect.Float64: values.Add(name, strconv.FormatFloat(field.Float(), 'f', -1, 64)) case reflect.Ptr, reflect.Interface: values = merge(values, plain_extract_pointer(field)) } return values }
func convertToFloat64(depth int, v reflect.Value) (float64, bool) { if v.Kind() == reflect.Interface { v = v.Elem() } switch v.Kind() { case reflect.Float32, reflect.Float64: return v.Float(), true case reflect.Int16, reflect.Int8, reflect.Int, reflect.Int32, reflect.Int64: return float64(v.Int()), true case reflect.String: s := v.String() var f float64 var err error if strings.HasPrefix(s, "0x") { f, err = strconv.ParseFloat(s, 64) } else { f, err = strconv.ParseFloat(s, 64) } if err == nil { return float64(f), true } if depth == 0 { s = intStrReplacer.Replace(s) rv := reflect.ValueOf(s) return convertToFloat64(1, rv) } case reflect.Slice: // Should we grab first one? Or Error? //u.Warnf("ToFloat() but is slice?: %T first=%v", v, v.Index(0)) return convertToFloat64(0, v.Index(0)) default: //u.Warnf("Cannot convert type? %v", v.Kind()) } return math.NaN(), false }
func encodeValue(buf []byte, prefix, name string, fv reflect.Value, inArray, arrayTable bool) ([]byte, error) { switch t := fv.Interface().(type) { case Marshaler: b, err := t.MarshalTOML() if err != nil { return nil, err } return appendNewline(append(appendKey(buf, name, inArray, arrayTable), b...), inArray, arrayTable), nil case time.Time: return appendNewline(encodeTime(appendKey(buf, name, inArray, arrayTable), t), inArray, arrayTable), nil } switch fv.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return appendNewline(encodeInt(appendKey(buf, name, inArray, arrayTable), fv.Int()), inArray, arrayTable), nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: return appendNewline(encodeUint(appendKey(buf, name, inArray, arrayTable), fv.Uint()), inArray, arrayTable), nil case reflect.Float32, reflect.Float64: return appendNewline(encodeFloat(appendKey(buf, name, inArray, arrayTable), fv.Float()), inArray, arrayTable), nil case reflect.Bool: return appendNewline(encodeBool(appendKey(buf, name, inArray, arrayTable), fv.Bool()), inArray, arrayTable), nil case reflect.String: return appendNewline(encodeString(appendKey(buf, name, inArray, arrayTable), fv.String()), inArray, arrayTable), nil case reflect.Slice, reflect.Array: ft := fv.Type().Elem() for ft.Kind() == reflect.Ptr { ft = ft.Elem() } if ft.Kind() == reflect.Struct { name := tableName(prefix, name) var err error for i := 0; i < fv.Len(); i++ { if buf, err = marshal(append(append(append(buf, '[', '['), name...), ']', ']', '\n'), name, fv.Index(i), false, true); err != nil { return nil, err } } return buf, nil } buf = append(appendKey(buf, name, inArray, arrayTable), '[') var err error for i := 0; i < fv.Len(); i++ { if i != 0 { buf = append(buf, ',') } if buf, err = encodeValue(buf, prefix, name, fv.Index(i), true, false); err != nil { return nil, err } } return appendNewline(append(buf, ']'), inArray, arrayTable), nil case reflect.Struct: name := tableName(prefix, name) return marshal(append(append(append(buf, '['), name...), ']', '\n'), name, fv, inArray, arrayTable) case reflect.Interface: var err error if buf, err = encodeInterface(appendKey(buf, name, inArray, arrayTable), fv.Interface()); err != nil { return nil, err } return appendNewline(buf, inArray, arrayTable), nil } return nil, fmt.Errorf("toml: marshal: unsupported type %v", fv.Kind()) }
// isZero reports whether the value is the zero of its type. func isZero(val reflect.Value) bool { switch val.Kind() { case reflect.Array: for i := 0; i < val.Len(); i++ { if !isZero(val.Index(i)) { return false } } return true case reflect.Map, reflect.Slice, reflect.String: return val.Len() == 0 case reflect.Bool: return !val.Bool() case reflect.Complex64, reflect.Complex128: return val.Complex() == 0 case reflect.Chan, reflect.Func, reflect.Ptr: return val.IsNil() case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return val.Int() == 0 case reflect.Float32, reflect.Float64: return val.Float() == 0 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: return val.Uint() == 0 case reflect.Struct: for i := 0; i < val.NumField(); i++ { if !isZero(val.Field(i)) { return false } } return true } panic("unknown type in isZero " + val.Type().String()) }
func isZero(v reflect.Value) bool { switch v.Kind() { case reflect.String: return len(v.String()) == 0 case reflect.Ptr, reflect.Interface: return v.IsNil() case reflect.Slice: return v.Len() == 0 case reflect.Map: return v.Len() == 0 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return v.Int() == 0 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: return v.Uint() == 0 case reflect.Float32, reflect.Float64: return v.Float() == 0 case reflect.Bool: return !v.Bool() case reflect.Struct: vt := v.Type() if vt == typeTime { return v.Interface().(time.Time).IsZero() } for i := 0; i < v.NumField(); i++ { if vt.Field(i).PkgPath != "" && !vt.Field(i).Anonymous { continue // Private field } if !isZero(v.Field(i)) { return false } } return true } return false }
func (encoder *Encoder) encode(v reflect.Value) error { switch v.Kind() { case reflect.Map: return encoder.encodeMap(v) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: return encoder.encodeUint(v.Uint()) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return encoder.encodeInt(v.Int()) case reflect.String: return encoder.encodeString(v.String()) case reflect.Array: v = v.Slice(0, v.Len()) return encoder.encodeSlice(v) case reflect.Slice: return encoder.encodeSlice(v) case reflect.Float64, reflect.Float32: return encoder.encodeFloat(v.Float()) case reflect.Interface: v = reflect.ValueOf(v.Interface()) return encoder.encode(v) case reflect.Ptr: if v.IsNil() { return encoder.encodeNull() } vv := reflect.Indirect(v) if vv.Kind() == reflect.Struct { return encoder.encodeStruct(v) } return encoder.encode(vv) } return errors.New("unsupported type:" + v.Type().String()) }
// convert to float64 func ToFloat(input reflect.Value) (output float64, err error) { //defer checkError(err) if !input.IsValid() { return 0, newTypeErr(methodName(), "input is invalid", input) } input = Underlying(input) k := input.Kind() switch { case IsBool(k): if input.Bool() { return 1, nil } return 0, nil case IsInt(k): return float64(input.Int()), nil case IsUint(k): return float64(input.Uint()), nil case IsFloat(k): return input.Float(), nil case IsString(k): return strconv.ParseFloat(input.String(), 32) default: } return 0, newTypeErr(methodName(), "input can not convert to float", input) }
func (p *printer) marshalSimple(typ reflect.Type, val reflect.Value) error { // Normally we don't see structs, but this can happen for an attribute. if val.Type() == timeType { p.WriteString(val.Interface().(time.Time).Format(time.RFC3339Nano)) return nil } switch val.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: p.WriteString(strconv.FormatInt(val.Int(), 10)) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: p.WriteString(strconv.FormatUint(val.Uint(), 10)) case reflect.Float32, reflect.Float64: p.WriteString(strconv.FormatFloat(val.Float(), 'g', -1, 64)) case reflect.String: // TODO: Add EscapeString. Escape(p, []byte(val.String())) case reflect.Bool: p.WriteString(strconv.FormatBool(val.Bool())) case reflect.Array: // will be [...]byte bytes := make([]byte, val.Len()) for i := range bytes { bytes[i] = val.Index(i).Interface().(byte) } Escape(p, bytes) case reflect.Slice: // will be []byte Escape(p, val.Bytes()) default: return &UnsupportedTypeError{typ} } return p.cachedWriteError() }
// length tests whether a variable's length is equal to a given // value. For strings it tests the number of characters whereas // for maps and slices it tests the number of items. func hasLengthOf(v *Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool { switch fieldKind { case reflect.String: p := asInt(param) return int64(utf8.RuneCountInString(field.String())) == p case reflect.Slice, reflect.Map, reflect.Array: p := asInt(param) return int64(field.Len()) == p case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: p := asInt(param) return field.Int() == p case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: p := asUint(param) return field.Uint() == p case reflect.Float32, reflect.Float64: p := asFloat(param) return field.Float() == p } panic(fmt.Sprintf("Bad field type %T", field.Interface())) }
func encodeString(v reflect.Value, opts *Options) string { switch v.Kind() { case reflect.String: return v.String() case reflect.Bool: return strconv.FormatBool(v.Bool()) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return strconv.FormatInt(v.Int(), 10) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: return strconv.FormatUint(v.Uint(), 10) case reflect.Float32, reflect.Float64: return strconv.FormatFloat(v.Float(), 'f', -1, v.Type().Bits()) case reflect.Slice: l := v.Len() vals := make([]string, l) for i := 0; i < l; i++ { sv := v.Index(i) vals[i] = encodeString(sv, opts) } return strings.Join(vals, opts.SliceSeparator) } panic("EncodeString unsupported val kind " + v.Kind().String()) }
func numericReflectedValueString(v reflect.Value) (string, error) { switch v.Kind() { case reflect.Bool: x := v.Bool() if x { return "1", nil } else { return "0", nil } case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return strconv.FormatInt(v.Int(), 10), nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: return strconv.FormatUint(v.Uint(), 10), nil case reflect.Float32, reflect.Float64: f := v.Float() if math.IsInf(f, 0) || math.IsNaN(f) { return "", fmt.Errorf("UnsupportedValueError %#v (formatted float: %s)", v, strconv.FormatFloat(f, 'g', -1, v.Type().Bits())) } return strconv.FormatFloat(f, 'g', -1, v.Type().Bits()), nil } return "", fmt.Errorf("UnsupportedNumericValueError %#v", v.Type()) }
// toFloat64 convert all reflect.Value-s into float64. func ToFloat64(v reflect.Value) float64 { if v.Kind() == reflect.Interface { v = v.Elem() } switch v.Kind() { case reflect.Float32, reflect.Float64: return v.Float() case reflect.Int16, reflect.Int8, reflect.Int, reflect.Int32, reflect.Int64: return float64(v.Int()) case reflect.String: s := v.String() var f float64 var err error if strings.HasPrefix(s, "0x") { f, err = strconv.ParseFloat(s, 64) } else { f, err = strconv.ParseFloat(s, 64) } if err == nil { return float64(f) } case reflect.Slice: // Should we grab first one? item1 := v.Index(0) u.Infof("is slice of strings?: %T", v, item1) default: u.Warnf("Cannot convert type? %v", v.Kind()) } return math.NaN() }
func (me *Record) PutValue(key string, value reflect.Value) { monolog.Debug("PutValue: %s %v", key, value) stringer, ok := value.Interface().(fmt.Stringer) if ok { me.Put(key, stringer.String()) return } switch value.Kind() { case reflect.Int, reflect.Int32, reflect.Int64: me.Putf(key, "%d", value.Int()) case reflect.Uint, reflect.Uint32, reflect.Uint64: me.Putf(key, "%d", value.Uint()) case reflect.Float32, reflect.Float64: me.Putf(key, "%f", value.Float()) case reflect.String: me.Putf(key, "%s", value.String()) case reflect.Struct: me.PutStruct(key+".", value.Interface()) default: me.Put(key, "???") } monolog.Debug("Put: key %s value %s, result %v", key, value, me) }
// toInt64 convert all reflect.Value-s into int64. func ToInt64(v reflect.Value) (int64, bool) { if v.Kind() == reflect.Interface { v = v.Elem() } switch v.Kind() { case reflect.Float32, reflect.Float64: return int64(v.Float()), true case reflect.Int, reflect.Int32, reflect.Int64: return v.Int(), true case reflect.String: s := v.String() var i int64 var err error if strings.HasPrefix(s, "0x") { i, err = strconv.ParseInt(s, 16, 64) } else if strings.Contains(s, ".") { fv, err := strconv.ParseFloat(s, 64) if err == nil { return int64(fv), true } return int64(0), false } else { i, err = strconv.ParseInt(s, 10, 64) } if err == nil { return int64(i), true } case reflect.Slice: if v.Len() > 0 { return ToInt64(v.Index(0)) } } return 0, false }
func (p *printer) marshalSimple(typ reflect.Type, val reflect.Value) error { switch val.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: p.WriteString(strconv.FormatInt(val.Int(), 10)) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: p.WriteString(strconv.FormatUint(val.Uint(), 10)) case reflect.Float32, reflect.Float64: p.WriteString(strconv.FormatFloat(val.Float(), 'g', -1, 64)) case reflect.String: // TODO: Add EscapeString. Escape(p, []byte(val.String())) case reflect.Bool: p.WriteString(strconv.FormatBool(val.Bool())) case reflect.Array: // will be [...]byte bytes := make([]byte, val.Len()) for i := range bytes { bytes[i] = val.Index(i).Interface().(byte) } Escape(p, bytes) case reflect.Slice: // will be []byte Escape(p, val.Bytes()) default: return &UnsupportedTypeError{typ} } return nil }
func encodeBasic(v reflect.Value) string { t := v.Type() switch k := t.Kind(); k { case reflect.Bool: return strconv.FormatBool(v.Bool()) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return strconv.FormatInt(v.Int(), 10) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: return strconv.FormatUint(v.Uint(), 10) case reflect.Float32: return strconv.FormatFloat(v.Float(), 'g', -1, 32) case reflect.Float64: return strconv.FormatFloat(v.Float(), 'g', -1, 64) case reflect.Complex64, reflect.Complex128: s := fmt.Sprintf("%g", v.Complex()) return strings.TrimSuffix(strings.TrimPrefix(s, "("), ")") case reflect.String: return v.String() } panic(t.String() + " has unsupported kind " + t.Kind().String()) }
// valueSortLess returns whether the first value should sort before the second // value. It is used by valueSorter.Less as part of the sort.Interface // implementation. func valueSortLess(a, b reflect.Value) bool { switch a.Kind() { case reflect.Bool: return !a.Bool() && b.Bool() case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: return a.Int() < b.Int() case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: return a.Uint() < b.Uint() case reflect.Float32, reflect.Float64: return a.Float() < b.Float() case reflect.String: return a.String() < b.String() case reflect.Uintptr: return a.Uint() < b.Uint() case reflect.Array: // Compare the contents of both arrays. l := a.Len() for i := 0; i < l; i++ { av := a.Index(i) bv := b.Index(i) if av.Interface() == bv.Interface() { continue } return valueSortLess(av, bv) } } return a.String() < b.String() }
func formatValue(value reflect.Value, indentation uint) string { if indentation > MaxDepth { return "..." } if isNilValue(value) { return "nil" } if UseStringerRepresentation { if value.CanInterface() { obj := value.Interface() switch x := obj.(type) { case fmt.GoStringer: return x.GoString() case fmt.Stringer: return x.String() } } } switch value.Kind() { case reflect.Bool: return fmt.Sprintf("%v", value.Bool()) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return fmt.Sprintf("%v", value.Int()) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: return fmt.Sprintf("%v", value.Uint()) case reflect.Uintptr: return fmt.Sprintf("0x%x", value.Uint()) case reflect.Float32, reflect.Float64: return fmt.Sprintf("%v", value.Float()) case reflect.Complex64, reflect.Complex128: return fmt.Sprintf("%v", value.Complex()) case reflect.Chan: return fmt.Sprintf("0x%x", value.Pointer()) case reflect.Func: return fmt.Sprintf("0x%x", value.Pointer()) case reflect.Ptr: return formatValue(value.Elem(), indentation) case reflect.Slice: return formatSlice(value, indentation) case reflect.String: return formatString(value.String(), indentation) case reflect.Array: return formatSlice(value, indentation) case reflect.Map: return formatMap(value, indentation) case reflect.Struct: return formatStruct(value, indentation) case reflect.Interface: return formatValue(value.Elem(), indentation) default: if value.CanInterface() { return fmt.Sprintf("%#v", value.Interface()) } else { return fmt.Sprintf("%#v", value) } } }
func refToVal(ref reflect.Value) Value { switch ref.Kind() { case reflect.Bool: return boolValue(ref.Bool()) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return intValue(ref.Int()) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: return intValue(ref.Uint()) case reflect.Float32, reflect.Float64: return floatValue(ref.Float()) case reflect.Complex64, reflect.Complex128: return complexValue(ref.Complex()) case reflect.Array, reflect.Slice: return arrayValue{reflectValue(ref)} case reflect.Chan: return chanValue{reflectValue(ref)} case reflect.Map: return mapValue{reflectValue(ref)} case reflect.Ptr: return pointerValue{reflectValue(ref)} case reflect.String: return stringValue(ref.String()) case reflect.Struct: return structValue{reflectValue(ref)} } return nilValue(0) }
func (this *databaseImplement) value2Interface(fieldValue reflect.Value) (interface{}, error) { fieldType := fieldValue.Type() fieldTypeKind := fieldType.Kind() switch fieldTypeKind { case reflect.Bool: return fieldValue.Bool(), nil case reflect.String: return fieldValue.String(), nil case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: return fieldValue.Int(), nil case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: return fieldValue.Uint(), nil case reflect.Float32, reflect.Float64: return fieldValue.Float(), nil case reflect.Struct: if fieldType == reflect.TypeOf(time.Time{}) { t := fieldValue.Interface().(time.Time) tf := t.Format("2006-01-02 15:04:05") return tf, nil } else { return nil, fmt.Errorf("Unsupported type %v", fieldType) } default: return nil, fmt.Errorf("Unsupported type %v", fieldType) } }
func (e *Encoder) encodeFloat(rv reflect.Value, name string, inlist bool) error { err := e.emit(tagFloat, name, inlist) if err != nil { return err } return e.writeF32(float32(rv.Float())) }
// isTrue reports whether the value is 'true', in the sense of not the zero of its type, // and whether the value has a meaningful truth value. func isTrue(val reflect.Value) (truth, ok bool) { if !val.IsValid() { // Something like var x interface{}, never set. It's a form of nil. return false, true } switch val.Kind() { case reflect.Array, reflect.Map, reflect.Slice, reflect.String: truth = val.Len() > 0 case reflect.Bool: truth = val.Bool() case reflect.Complex64, reflect.Complex128: truth = val.Complex() != 0 case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Interface: truth = !val.IsNil() case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: truth = val.Int() != 0 case reflect.Float32, reflect.Float64: truth = val.Float() != 0 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: truth = val.Uint() != 0 case reflect.Struct: truth = true // Struct values are always true. default: return } return truth, true }
func (e *Encoder) encodeDouble(rv reflect.Value, name string, inlist bool) error { err := e.emit(tagDouble, name, inlist) if err != nil { return err } return e.writeF64(rv.Float()) }
// for insert and update // If already assigned, then just ignore tag func GetValQuoteStr(val reflect.Value) (string, error) { switch val.Kind() { case reflect.Bool: boolStr := "N" if val.Bool() { boolStr = "Y" } return boolStr, nil case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return strconv.FormatInt(val.Int(), 10), nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: return strconv.FormatUint(val.Uint(), 10), nil case reflect.Float32, reflect.Float64: return strconv.FormatFloat(val.Float(), 'f', -1, 64), nil case reflect.String: return QuoteStr(val.String()), nil case reflect.Slice: //[]byte if val.Type().Elem().Name() != "uint8" { return "", fmt.Errorf("GetValQuoteStr> slicetype is not []byte: %v", val.Interface()) } return QuoteStr(string(val.Interface().([]byte))), nil default: return "", fmt.Errorf("GetValQuoteStr> reflect.Value is not a string/int/uint/float/bool/[]byte!\nval: %v", val) } return "", nil }
// Validate checks whether the given value is writeable to this schema. func (*NullSchema) Validate(v reflect.Value) bool { // Check if the value is something that can be null switch v.Kind() { case reflect.Interface: return v.IsNil() case reflect.Array: return v.Cap() == 0 case reflect.Slice: return v.IsNil() || v.Cap() == 0 case reflect.Map: return len(v.MapKeys()) == 0 case reflect.String: return len(v.String()) == 0 case reflect.Float32: // Should NaN floats be treated as null? return math.IsNaN(v.Float()) case reflect.Float64: // Should NaN floats be treated as null? return math.IsNaN(v.Float()) case reflect.Ptr: return v.IsNil() case reflect.Invalid: return true } // Nothing else in particular, so this should not validate? return false }
func isZero(v reflect.Value) bool { switch v.Kind() { case reflect.String: return len(v.String()) == 0 case reflect.Interface, reflect.Ptr: return v.IsNil() case reflect.Slice: return v.Len() == 0 case reflect.Map: return v.Len() == 0 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return v.Int() == 0 case reflect.Float32, reflect.Float64: return v.Float() == 0 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: return v.Uint() == 0 case reflect.Bool: return !v.Bool() case reflect.Struct: vt := v.Type() for i := v.NumField() - 1; i >= 0; i-- { if vt.Field(i).PkgPath != "" { continue // Private field } if !isZero(v.Field(i)) { return false } } return true } return false }
func getFieldAsString(field reflect.Value) (str string, err error) { switch field.Kind() { case reflect.String: return field.String(), nil case reflect.Bool: str, err = toString(field.Bool()) if err != nil { return str, err } case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: str, err = toString(field.Int()) if err != nil { return str, err } case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: str, err = toString(field.Uint()) if err != nil { return str, err } case reflect.Float32, reflect.Float64: str, err = toString(field.Float()) if err != nil { return str, err } default: return marshall(field) } return str, nil }