// 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 convertAssignInt(d reflect.Value, s int64) (err error) { switch d.Type().Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: d.SetInt(s) if d.Int() != s { err = strconv.ErrRange d.SetInt(0) } case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: if s < 0 { err = strconv.ErrRange } else { x := uint64(s) d.SetUint(x) if d.Uint() != x { err = strconv.ErrRange d.SetUint(0) } } case reflect.Bool: d.SetBool(s != 0) default: err = cannotConvert(d, s) } return }
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 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 }
// 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 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 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 indexBytes(typ reflect.Type, value reflect.Value) (b []byte, err error) { switch typ.Kind() { case reflect.String: b = []byte(value.String()) case reflect.Int: buf := new(bytes.Buffer) if err = binary.Write(buf, binary.BigEndian, value.Int()); err != nil { return } b = buf.Bytes() case reflect.Slice: switch typ.Elem().Kind() { case reflect.Uint8: b = value.Bytes() default: err = fmt.Errorf("%v is not an indexable type", typ) } case reflect.Bool: if value.Bool() { b = []byte{1} } else { b = []byte{0} } default: err = fmt.Errorf("%v is not an indexable type", typ) return } if len(b) == 0 { b = []byte{0} } return }
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 (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()) }
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) }
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 }
// formatAtom formats a value without inspecting its internal structure. // It is a copy of the the function in gopl.io/ch11/format. func formatAtom(v reflect.Value) string { switch v.Kind() { case reflect.Invalid: return "invalid" 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, reflect.Uintptr: return strconv.FormatUint(v.Uint(), 10) // ...floating-point and complex cases omitted for brevity... case reflect.Bool: if v.Bool() { return "true" } return "false" case reflect.String: return strconv.Quote(v.String()) case reflect.Chan, reflect.Func, reflect.Ptr, reflect.Slice, reflect.Map: return v.Type().String() + " 0x" + strconv.FormatUint(uint64(v.Pointer()), 16) default: // reflect.Array, reflect.Struct, reflect.Interface return v.Type().String() + " value" } }
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() }
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() }
// 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 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 (c *FlatMapConfig) flatten(result map[string]interface{}, prefix string, v reflect.Value) error { var err error if v.Kind() == reflect.Interface { v = v.Elem() } // Set as type interface // https://golang.org/pkg/reflect/#Kind switch v.Kind() { case reflect.Bool: result[c.keyDelim+prefix] = v.Bool() case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32: result[c.keyDelim+prefix] = v.Int() case reflect.String: result[c.keyDelim+prefix] = v.String() case reflect.Map: err = c.flattenMap(result, prefix, v) case reflect.Slice, reflect.Array: err = c.flattenSlice(result, prefix, v) default: err = fmt.Errorf("Unknown primitive type found for value: '%q'", v) } return err }
func encode(b []byte, rv reflect.Value) ([]byte, error) { switch rk := rv.Kind(); rk { case reflect.Bool: b = encodeBool(b, rv.Bool()) case reflect.Int, reflect.Int8, reflect.Int64, reflect.Int32, reflect.Int16: b = encodeInt(b, rv.Int()) case reflect.Uint8, reflect.Uint64, reflect.Uint, reflect.Uint32, reflect.Uint16: b = encodeInt(b, int64(rv.Uint())) case reflect.String: b = encodeString(b, rv.String()) case reflect.Array, reflect.Slice: if rv.Len() == 0 && rv.Type().Elem().Kind() == reflect.Uint8 { b = encodeBytes(b, rv.Bytes()) } else if rv.Index(0).Kind() == reflect.Uint8 { b = encodeBytes(b, rv.Bytes()) } else { b = encodeArray(b, rv) } case reflect.Map: b = encodeMap(b, rv) case reflect.Struct: b = encodeStruct(b, rv) default: panic("no support for type") } return b, nil }
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) } }
// Returns the string representation of the field value func (enc *encoder) encodeCol(fv reflect.Value, st reflect.StructTag) string { switch fv.Kind() { case reflect.String: return fv.String() case reflect.Int, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int8: return fmt.Sprintf("%v", fv.Int()) case reflect.Float32: return encodeFloat(32, fv) case reflect.Float64: return encodeFloat(64, fv) case reflect.Bool: return encodeBool(fv.Bool(), st) case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint8: return fmt.Sprintf("%v", fv.Uint()) case reflect.Complex64, reflect.Complex128: return fmt.Sprintf("%+.3g", fv.Complex()) case reflect.Interface: return encodeInterface(fv, st) case reflect.Struct: return encodeInterface(fv, st) default: panic(fmt.Sprintf("Unsupported type %s", fv.Kind())) } return "" }
// packNum packs the given number (using the reflect value) and will cast it to appropriate number representation func packNum(value reflect.Value, to byte) []byte { switch kind := value.Kind(); kind { case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: if to == UintTy { return U2U256(value.Uint()) } else { return S2S256(int64(value.Uint())) } case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: if to == UintTy { return U2U256(uint64(value.Int())) } else { return S2S256(value.Int()) } case reflect.Ptr: // This only takes care of packing and casting. No type checking is done here. It should be done prior to using this function. if to == UintTy { return U256(value.Interface().(*big.Int)) } else { return S256(value.Interface().(*big.Int)) } } return nil }
// 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 (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} }
// 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 }
// 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 }
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()) }
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 }
// 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())) }