func (db *DataBinder) submitProperty(prop Property, field reflect.Value) error { value := prop.Get() if value == nil { // This happens e.g. if CurrentIndex() of a ComboBox returns -1. // FIXME: Should we handle this differently? return nil } if err, ok := value.(error); ok { return err } if f64, ok := value.(float64); ok { switch field.Kind() { case reflect.Float32, reflect.Float64: field.SetFloat(f64) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: field.SetInt(int64(f64)) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: field.SetUint(uint64(f64)) default: return newError(fmt.Sprintf("Field '%s': Can't convert float64 to %s.", prop.Source().(string), field.Type().Name())) } return nil } field.Set(reflect.ValueOf(value)) return nil }
func (tbl *Table) setVal(field *reflect.Value, val interface{}) { str, ok := val.(string) log.Println("trying to set") if ok { log.Println("setting string") field.SetString(str) return } i, ok := val.(int64) if ok { field.SetInt(i) return } ui, ok := val.(uint64) if ok { field.SetUint(ui) return } b, ok := val.(bool) if ok { field.SetBool(b) return } f, ok := val.(float64) if ok { field.SetFloat(f) return } t, ok := val.(time.Time) if ok { field.Set(reflect.ValueOf(t)) return } }
func setFieldDefaults(v reflect.Value, sf reflect.StructField, s reflect.Value) { if v.CanInterface() && reflect.DeepEqual( v.Interface(), reflect.Zero(v.Type()).Interface()) { tag := sf.Tag.Get("ebmldef") if tag != "" { switch v.Kind() { case reflect.Int, reflect.Int64: u, _ := strconv.ParseInt(tag, 10, 0) v.SetInt(int64(u)) case reflect.Uint, reflect.Uint64: u, _ := strconv.ParseUint(tag, 10, 0) v.SetUint(u) case reflect.Float32, reflect.Float64: f, _ := strconv.ParseFloat(tag, 64) v.SetFloat(f) case reflect.String: v.SetString(tag) default: log.Panic("Unsupported default value") } } ltag := sf.Tag.Get("ebmldeflink") if ltag != "" { v.Set(s.FieldByName(ltag)) } } }
func (e *Element) readField(v reflect.Value) (err error) { switch v.Kind() { case reflect.Struct: err = e.readStruct(v) case reflect.Slice: err = e.readSlice(v) case reflect.Array: for i, l := 0, v.Len(); i < l && err == nil; i++ { err = e.readStruct(v.Index(i)) } case reflect.String: var s string s, err = e.readString() v.SetString(s) case reflect.Int, reflect.Int64: var u uint64 u, err = e.readUint64() v.SetInt(int64(u)) case reflect.Uint, reflect.Uint64: var u uint64 u, err = e.readUint64() v.SetUint(u) case reflect.Float32, reflect.Float64: var f float64 f, err = e.readFloat() v.SetFloat(f) default: err = errors.New("Unknown type: " + v.String()) } return }
// setValue updates the field value in fv to the data extracted from config // with key. func setValue(fv *reflect.Value, c *Config, key string) error { // Update the value with the correct type switch fv.Kind() { case reflect.Int: val, err := c.GetInt(key) if err != nil { return err } fv.SetInt(int64(val)) case reflect.Float64: val, err := c.GetFloat(key) if err != nil { return err } fv.SetFloat(val) case reflect.Bool: val, err := c.GetBool(key) if err != nil { return err } fv.SetBool(val) case reflect.String: val, err := c.GetString(key) if err != nil { return err } fv.SetString(val) } return nil }
// setWithProperType sets proper value to field based on its type, // but it does not return error for failing parsing, // because we want to use default value that is already assigned to strcut. func setWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string) error { switch t.Kind() { case reflect.String: if len(key.String()) == 0 { return nil } field.SetString(key.String()) case reflect.Bool: boolVal, err := key.Bool() if err != nil { return nil } field.SetBool(boolVal) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: durationVal, err := key.Duration() // Skip zero value if err == nil && int(durationVal) > 0 { field.Set(reflect.ValueOf(durationVal)) return nil } intVal, err := key.Int64() if err != nil || intVal == 0 { return nil } field.SetInt(intVal) // byte is an alias for uint8, so supporting uint8 breaks support for byte case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uint64: durationVal, err := key.Duration() // Skip zero value if err == nil && int(durationVal) > 0 { field.Set(reflect.ValueOf(durationVal)) return nil } uintVal, err := key.Uint64() if err != nil { return nil } field.SetUint(uintVal) case reflect.Float64: floatVal, err := key.Float64() if err != nil { return nil } field.SetFloat(floatVal) case reflectTime: timeVal, err := key.Time() if err != nil { return nil } field.Set(reflect.ValueOf(timeVal)) case reflect.Slice: return setSliceWithProperType(key, field, delim) default: return fmt.Errorf("unsupported type '%s'", t) } return nil }
func setConfigVal(str string, field reflect.Value) error { t := field.Kind() switch { case t == reflect.String: field.SetString(str) case t >= reflect.Int && t <= reflect.Int64: if x, err := strconv.ParseInt(str, 10, 64); err != nil { return err } else { field.SetInt(x) } case t >= reflect.Uint && t <= reflect.Uint64: if x, err := strconv.ParseUint(str, 10, 64); err != nil { return err } else { field.SetUint(x) } case t >= reflect.Float32 && t <= reflect.Float64: if x, err := strconv.ParseFloat(str, 64); err != nil { return err } else { field.SetFloat(x) } case t == reflect.Bool: if x, err := strconv.ParseBool(str); err != nil { return err } else { field.SetBool(x) } default: return nil } return nil }
func (d *Decoder) decodeField(v reflect.Value, val string) error { switch v.Type() { case reflect.TypeOf(time.Duration(0)): a, err := time.ParseDuration(val) if err != nil { return err } v.SetInt(int64(a)) default: switch v.Kind() { case reflect.String: v.SetString(val) case reflect.Int, reflect.Int32, reflect.Int64: v.Type() nv, err := strconv.ParseInt(val, 10, 64) if err != nil { return err } v.SetInt(nv) case reflect.Bool: b, err := strconv.ParseBool(val) if err != nil { return err } v.SetBool(b) case reflect.Float32, reflect.Float64: f, err := strconv.ParseFloat(val, 64) if err != nil { return err } v.SetFloat(f) } } return nil }
func (decoder *Decoder) readFloat(value reflect.Value) error { bytes, err := decoder.readBytes(8) if err != nil { return err } n := uint64(0) for _, b := range bytes { n <<= 8 n |= uint64(b) } v := math.Float64frombits(n) switch value.Kind() { case reflect.Float32, reflect.Float64: value.SetFloat(v) case reflect.Int32, reflect.Int, reflect.Int64: value.SetInt(int64(v)) case reflect.Uint32, reflect.Uint, reflect.Uint64: value.SetUint(uint64(v)) case reflect.Interface: value.Set(reflect.ValueOf(v)) default: return errors.New("invalid type:" + value.Type().String() + " for double") } return nil }
// This sets the value in a struct of an indeterminate type to the // matching value from the request (via Form middleware) in the // same type, so that not all deserialized values have to be strings. // Supported types are string, int, float, and bool. func setWithProperType(valueKind reflect.Kind, val string, structField reflect.Value, nameInTag string, errors Errors) { if scan, ok := structField.Addr().Interface().(sql.Scanner); ok { scan.Scan(val) return } switch valueKind { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: if val == "" { val = "0" } intVal, err := strconv.ParseInt(val, 10, 64) if err != nil { errors.Add([]string{nameInTag}, TypeError, "Value could not be parsed as integer") } else { structField.SetInt(intVal) } case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: if val == "" { val = "0" } uintVal, err := strconv.ParseUint(val, 10, 64) if err != nil { errors.Add([]string{nameInTag}, TypeError, "Value could not be parsed as unsigned integer") } else { structField.SetUint(uintVal) } case reflect.Bool: if val == "" { val = "false" } boolVal, err := strconv.ParseBool(val) if err != nil { errors.Add([]string{nameInTag}, TypeError, "Value could not be parsed as boolean") } else { structField.SetBool(boolVal) } case reflect.Float32: if val == "" { val = "0.0" } floatVal, err := strconv.ParseFloat(val, 32) if err != nil { errors.Add([]string{nameInTag}, TypeError, "Value could not be parsed as 32-bit float") } else { structField.SetFloat(floatVal) } case reflect.Float64: if val == "" { val = "0.0" } floatVal, err := strconv.ParseFloat(val, 64) if err != nil { errors.Add([]string{nameInTag}, TypeError, "Value could not be parsed as 64-bit float") } else { structField.SetFloat(floatVal) } case reflect.String: structField.SetString(val) } }
// setFieldVal first converts v to the type of structField, then uses reflection // to set the field to the converted value. func setFieldVal(structField reflect.Value, name string, v string) error { switch structField.Kind() { case reflect.String: structField.SetString(v) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: vInt, err := strconv.Atoi(v) if err != nil { return fmt.Errorf("envvar: Error parsing environment variable %s: %s\n%s", name, v, err.Error()) } structField.SetInt(int64(vInt)) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: vUint, err := strconv.ParseUint(v, 10, 64) if err != nil { return fmt.Errorf("envvar: Error parsing environment variable %s: %s\n%s", name, v, err.Error()) } structField.SetUint(uint64(vUint)) case reflect.Float32, reflect.Float64: vFloat, err := strconv.ParseFloat(v, 64) if err != nil { return fmt.Errorf("envvar: Error parsing environment variable %s: %s\n%s", name, v, err.Error()) } structField.SetFloat(vFloat) case reflect.Bool: vBool, err := strconv.ParseBool(v) if err != nil { return fmt.Errorf("envvar: Error parsing environment variable %s: %s\n%s", name, v, err.Error()) } structField.SetBool(vBool) default: return fmt.Errorf("envvar: Unsupported struct field type: %s", structField.Type().String()) } return nil }
func processField(value string, field reflect.Value) error { typ := field.Type() decoder := decoderFrom(field) if decoder != nil { return decoder.Decode(value) } switch typ.Kind() { case reflect.String: field.SetString(value) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: var ( val int64 err error ) if field.Kind() == reflect.Int64 && typ.PkgPath() == "time" && typ.Name() == "Duration" { var d time.Duration d, err = time.ParseDuration(value) val = int64(d) } else { val, err = strconv.ParseInt(value, 0, typ.Bits()) } if err != nil { return err } field.SetInt(val) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: val, err := strconv.ParseUint(value, 0, typ.Bits()) if err != nil { return err } field.SetUint(val) case reflect.Bool: val, err := strconv.ParseBool(value) if err != nil { return err } field.SetBool(val) case reflect.Float32, reflect.Float64: val, err := strconv.ParseFloat(value, typ.Bits()) if err != nil { return err } field.SetFloat(val) case reflect.Slice: vals := strings.Split(value, ",") sl := reflect.MakeSlice(typ, len(vals), len(vals)) for i, val := range vals { err := processField(val, sl.Index(i)) if err != nil { return err } } field.Set(sl) } return nil }
// setWithProperType sets proper value to field based on its type, // but it does not return error for failing parsing, // because we want to use default value that is already assigned to strcut. func setWithProperType(kind reflect.Kind, key *Key, field reflect.Value, delim string) error { switch kind { case reflect.String: if len(key.String()) == 0 { return nil } field.SetString(key.String()) case reflect.Bool: boolVal, err := key.Bool() if err != nil { return nil } field.SetBool(boolVal) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: intVal, err := key.Int64() if err != nil { return nil } field.SetInt(intVal) case reflect.Float64: floatVal, err := key.Float64() if err != nil { return nil } field.SetFloat(floatVal) case reflectTime: timeVal, err := key.Time() if err != nil { return nil } field.Set(reflect.ValueOf(timeVal)) case reflect.Slice: vals := key.Strings(delim) numVals := len(vals) if numVals == 0 { return nil } sliceOf := field.Type().Elem().Kind() var times []time.Time if sliceOf == reflectTime { times = key.Times(delim) } slice := reflect.MakeSlice(field.Type(), numVals, numVals) for i := 0; i < numVals; i++ { switch sliceOf { case reflectTime: slice.Index(i).Set(reflect.ValueOf(times[i])) default: slice.Index(i).Set(reflect.ValueOf(vals[i])) } } field.Set(slice) default: return fmt.Errorf("unsupported type '%s'", kind) } return nil }
func numberDecoder(node RMNode, data interface{}, v reflect.Value) { val, err := redis.String(data, nil) if err != nil { panic(err) } switch v.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: n, err := strconv.ParseInt(val, 10, 64) if err != nil || v.OverflowInt(n) { panic(fmt.Sprintf("Unable to convert int: %s \n", val)) } v.SetInt(n) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: n, err := strconv.ParseUint(val, 10, 64) if err != nil || v.OverflowUint(n) { panic(fmt.Sprintf("Unable to convert uint: %s \n", val)) } v.SetUint(n) case reflect.Float32, reflect.Float64: n, err := strconv.ParseFloat(val, v.Type().Bits()) if err != nil || v.OverflowFloat(n) { panic(fmt.Sprintf("Unable to convert float: %s \n", val)) } v.SetFloat(n) default: panic(fmt.Sprintf("Unsupported number convertion for type[%v] with value[%v]", v.Type(), data)) } }
// type(1) | name length(1) | raw name bytes | 0x00 | value bytes(8) func (d *decodeState) double(v reflect.Value) { d.off += 1 // type klen := int(Int8(d.data[d.off:])) d.off += 1 // name length if klen > 0 { key := d.data[d.off : d.off+klen-1] d.off += klen v = fieldByTag(v, key) u, pv := d.indirect(v, false) if u != nil { d.off -= 1 + 1 + klen if err := u.UnmarshalMCPACK(d.next()); err != nil { d.error(err) } return } v = pv } val := Float64(d.data[d.off:]) d.off += 8 if !v.IsValid() { return } v.SetFloat(val) }
func parseStringToOutStruct(inValue reflect.Value, inField reflect.StructField, outValue reflect.Value) error { var outField reflect.Value outEl := outValue.Elem() if boolTag := inField.Tag.Get("parseBool"); boolTag != "" { split := strings.Split(boolTag, ",") boolOutName := split[0] boolTrueVals := split[1:] outToSet := parseStringToBool(inValue.String(), boolTrueVals...) outField = outEl.FieldByName(boolOutName) outField.Set(reflect.ValueOf(outToSet)) return nil } outField = outEl.FieldByName(inField.Name) switch outField.Kind() { case reflect.String: outField.Set(inValue) case reflect.Int: outField.SetInt(parseStringToInt(inValue.String())) case reflect.Float64: outField.SetFloat(parseStringToFloat(inValue.String())) default: if _, ok := outField.Interface().(time.Time); ok { outField.Set(reflect.ValueOf(parseStringToTime(inValue.String()))) } else { return errors.New(fmt.Sprintf("Unsupported: %s", outField.Kind().String())) } } return nil }
func luaU_FetchFloat(l Lua_State, v *reflect.Value) (ok bool) { if ok = Lua_isnumber(l, -1); ok { v.SetFloat(float64(Lua_tonumber(l, -1))) } Lua_pop(l, 1) return }
func (p *Decoder) unmarshalLaxString(s string, val reflect.Value) { switch val.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: i := mustParseInt(s, 10, 64) val.SetInt(i) return case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: i := mustParseUint(s, 10, 64) val.SetUint(i) return case reflect.Float32, reflect.Float64: f := mustParseFloat(s, 64) val.SetFloat(f) return case reflect.Bool: b := mustParseBool(s) val.SetBool(b) return case reflect.Struct: if val.Type() == timeType { t, err := time.Parse(textPlistTimeLayout, s) if err != nil { panic(err) } val.Set(reflect.ValueOf(t.In(time.UTC))) return } fallthrough default: panic(&incompatibleDecodeTypeError{val.Type(), String}) } }
func setValue(elmv *reflect.Value, f Field) { switch f.Kind { case "int", "int64", "long": itemValue, innerr := strconv.ParseInt(f.Value, 10, 64) if innerr != nil { itemValue = 0 } elmv.SetInt(itemValue) case "float", "float64", "double": itemValue, innerr := strconv.ParseFloat(f.Value, 64) if innerr != nil { itemValue = 0 } elmv.SetFloat(itemValue) case "bool": itemValue, innerr := strconv.ParseBool(f.Value) if innerr != nil { itemValue = false } elmv.SetBool(itemValue) default: itemValue := f.Value elmv.SetString(itemValue) } }
func convertAssignBulkString(d reflect.Value, s []byte) (err error) { switch d.Type().Kind() { case reflect.Float32, reflect.Float64: var x float64 x, err = strconv.ParseFloat(string(s), d.Type().Bits()) d.SetFloat(x) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: var x int64 x, err = strconv.ParseInt(string(s), 10, d.Type().Bits()) d.SetInt(x) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: var x uint64 x, err = strconv.ParseUint(string(s), 10, d.Type().Bits()) d.SetUint(x) case reflect.Bool: var x bool x, err = strconv.ParseBool(string(s)) d.SetBool(x) case reflect.String: d.SetString(string(s)) case reflect.Slice: if d.Type().Elem().Kind() != reflect.Uint8 { err = cannotConvert(d, s) } else { d.SetBytes(s) } default: err = cannotConvert(d, s) } return }
func (d base) setModelValue(driverValue, fieldValue reflect.Value) error { switch fieldValue.Type().Kind() { case reflect.Bool: fieldValue.SetBool(d.dialect.parseBool(driverValue.Elem())) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: fieldValue.SetInt(driverValue.Elem().Int()) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: // reading uint from int value causes panic switch driverValue.Elem().Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: fieldValue.SetUint(uint64(driverValue.Elem().Int())) default: fieldValue.SetUint(driverValue.Elem().Uint()) } case reflect.Float32, reflect.Float64: fieldValue.SetFloat(driverValue.Elem().Float()) case reflect.String: fieldValue.SetString(string(driverValue.Elem().Bytes())) case reflect.Slice: if reflect.TypeOf(driverValue.Interface()).Elem().Kind() == reflect.Uint8 { fieldValue.SetBytes(driverValue.Elem().Bytes()) } case reflect.Struct: switch fieldValue.Interface().(type) { case time.Time: fieldValue.Set(driverValue.Elem()) default: if scanner, ok := fieldValue.Addr().Interface().(sql.Scanner); ok { return scanner.Scan(driverValue.Interface()) } } } return nil }
func (d *base) SetModelValue(driverValue, fieldValue reflect.Value) error { // ignore zero types if !driverValue.Elem().IsValid() { return nil } switch fieldValue.Type().Kind() { case reflect.Bool: fieldValue.SetBool(d.Dialect.ParseBool(driverValue.Elem())) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: fieldValue.SetInt(driverValue.Elem().Int()) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: // reading uint from int value causes panic switch driverValue.Elem().Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: fieldValue.SetUint(uint64(driverValue.Elem().Int())) default: fieldValue.SetUint(driverValue.Elem().Uint()) } case reflect.Float32, reflect.Float64: fieldValue.SetFloat(driverValue.Elem().Float()) case reflect.String: fieldValue.SetString(string(driverValue.Elem().Bytes())) case reflect.Slice: if reflect.TypeOf(driverValue.Interface()).Elem().Kind() == reflect.Uint8 { fieldValue.SetBytes(driverValue.Elem().Bytes()) } case reflect.Struct: if _, ok := fieldValue.Interface().(time.Time); ok { fieldValue.Set(driverValue.Elem()) } } return nil }
func parseAndSet(target reflect.Value, val string) error { if !target.CanSet() { return fmt.Errorf("Cannot set %v to %v", target, val) } switch kind := target.Type().Kind(); kind { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: intVal, err := strconv.ParseInt(val, 10, 64) if err == nil { target.SetInt(intVal) } return err case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: intVal, err := strconv.ParseUint(val, 10, 64) if err == nil { target.SetUint(intVal) } return err case reflect.Float32, reflect.Float64: floatVal, err := strconv.ParseFloat(val, 64) if err == nil { target.SetFloat(floatVal) } return err case reflect.String: target.SetString(val) return nil } return fmt.Errorf("Field %v has type %v, cannot set to %v", target, target.Type(), val) }
// Fill a single reflected field if it has the conf tag. // func (c *Config) getField(elem reflect.Value, group, key string) { var e error switch elem.Interface().(type) { case bool: var val bool val, e = c.Bool(group, key) elem.SetBool(val) case int: var val int val, e = c.Int(group, key) elem.SetInt(int64(val)) case string: var val string val, e = c.String(group, key) elem.SetString(val) case float64: var val float64 val, e = c.Float(group, key) elem.SetFloat(val) default: c.logError(errors.New("Parse conf: wrong type: " + elem.Kind().String())) } if e != nil { c.logError(errors.New("Parse conf: " + e.Error())) } }
func (d *MySQL) ValueToField(value reflect.Value, field reflect.Value) error { switch field.Type().Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: field.SetInt(value.Elem().Int()) case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: // reading uint from int value causes panic switch value.Elem().Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: field.SetUint(uint64(value.Elem().Int())) default: field.SetUint(value.Elem().Uint()) } case reflect.Float32, reflect.Float64: field.SetFloat(value.Elem().Float()) case reflect.String: if !value.Elem().IsValid() { field.SetString("") return nil } field.SetString(string(value.Elem().Bytes())) case reflect.Slice: if reflect.TypeOf(value.Interface()).Elem().Kind() == reflect.Uint8 { field.SetBytes(value.Elem().Bytes()) } case reflect.Struct: if field.Type() == reflect.TypeOf(time.Time{}) { field.Set(value.Elem()) } } return nil }
func (me Record) GetValue(key string, value reflect.Value) (err error) { /*stringer, ok := value.Interface().(fmt.Stringer) if ok { me.Gut(key, stringer.String()) return }*/ monolog.Debug("GetValue: %s %v", key, value) switch value.Kind() { case reflect.Int, reflect.Int32, reflect.Int64: value.SetInt(int64(me.GetIntDefault(key, 0))) case reflect.Uint, reflect.Uint32, reflect.Uint64: value.SetUint(uint64(me.GetIntDefault(key, 0))) case reflect.Float32, reflect.Float64: f, err := me.GetFloat(key) if err != nil { return err } value.SetFloat(f) case reflect.String: s, ok := me.MayGet(key) if !ok { return fmt.Errorf("Could not get string for key %s", key) } value.SetString(s) case reflect.Struct: me.GetStruct(key+".", value.Addr().Interface()) default: monolog.Warning("Don't know what to do with %v", value) } return nil }
func boolAsFloatDecoder(dv, sv reflect.Value) { if sv.Bool() { dv.SetFloat(1) } else { dv.SetFloat(0) } }
// subtractValue subtracts actual value of type float32. Nested data, like // slice, pointer and struct should not use this function. // string, int32 and int64 are taken as identifiers (should be // consistent in both input values). We set output of these types // to the value of the first input value. // // id indicates whether the type should be treated as an identifier. // // Returns (bool, bool) - (Is there a diff between the values, Is this value an identifier) func subtractValue(out, in1, in2 reflect.Value, section string, id bool) (bool, bool) { switch in1.Kind() { case reflect.Float32: if id { if in1.Float() != 0 { out.Set(in1) } else { out.Set(in2) } return false, true } if roundToTwoDecimal(in1.Float()-in2.Float()) == 0 { // This takes care of -0 values which may be returned by roundToTwoDecimal. out.SetFloat(0) return false, false } out.SetFloat(in1.Float() - in2.Float()) return true, false case reflect.String: if id { if in1.String() != "" { out.Set(in1) } else { out.Set(in2) } return false, true } if in1.String() == in2.String() { out.Set(in1) return false, false } s := combineProtoStrings(in1.String(), in2.String(), connector) out.SetString(*s) return true, false case reflect.Int32, reflect.Int64: if id { if in1.Int() != 0 { out.Set(in1) } else { out.Set(in2) } return false, true } if diff := in1.Int() - in2.Int(); diff != 0 { out.SetInt(diff) return true, false } out.SetInt(0) return false, false default: reportWarningf("subtracting %s type in %s not supported", in1.Kind().String(), section) out.Set(in1) return false, true } }
func _reflect(b []byte, v reflect.Value) int { switch v.Kind() { case reflect.String: s := ScanString(b) v.SetString(s) return len(s) + 1 case reflect.Bool: v.SetBool(Bool(b)) return 1 case reflect.Int: v.SetInt(int64(Int(b))) return 8 case reflect.Uint: v.SetUint(uint64(Uint(b))) return 8 case reflect.Int8: v.SetInt(int64(Int8(b))) case reflect.Uint8: v.SetUint(uint64(Uint8(b))) case reflect.Int16: v.SetInt(int64(Int16(b))) case reflect.Uint16: v.SetUint(uint64(Uint16(b))) case reflect.Int32: v.SetInt(int64(Int32(b))) case reflect.Uint32: v.SetUint(uint64(Uint32(b))) case reflect.Int64: v.SetInt(Int64(b)) case reflect.Uint64: v.SetUint(Uint64(b)) case reflect.Float32: v.SetFloat(float64(Float32(b))) case reflect.Float64: v.SetFloat(Float64(b)) case reflect.Complex64: v.SetComplex(complex128(Complex64(b))) case reflect.Complex128: v.SetComplex(Complex128(b)) case reflect.Struct: sum := 0 for i, n := 0, v.NumField(); i < n; i++ { if f := v.Field(i); f.CanSet() { s := _reflect(b[sum:], f) if s < 0 { return -1 } sum += s } } if sum == 0 { return -1 } return sum default: return -1 } return int(v.Type().Size()) }
func (d *Decoder) float64Value(value reflect.Value) error { v, err := d.DecodeFloat64() if err != nil { return err } value.SetFloat(v) return nil }