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 }
// IsBytesValidation will return if a field is a parseable bytes value. func IsBytesValidation(v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool { if fieldKind != reflect.String { // this is an issue with the code and really should be a panic return true } if field.String() == "" { return true } if hasReplTemplate(field) { // all bets are off return true } parts := bytesRe.FindStringSubmatch(strings.TrimSpace(field.String())) if len(parts) < 3 { return false } value, err := strconv.ParseUint(parts[1], 10, 0) if err != nil || value < 1 { return false } return true }
func ClusterInstanceFalse(v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool { if fieldKind != reflect.String { return true } valueStr := field.String() if valueStr == "" { return true } if hasReplTemplate(field) { // all bets are off return true } currentContainer := getCurrentContainer(currentStructOrField) if currentContainer == nil { // this is an issue with the code and really should be a panic return true } cluster, err := currentContainer.Cluster.ParseBool() if err != nil { // don't worry about this here. cluster should have the "bool" validator. return true } if cluster { return false } return true }
// 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 }
// ConfigItemWhenValidation will validate that the when element of a config item is in a valid format and references other valid, created objects. func ConfigItemWhenValidation(v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool { root, ok := topStruct.Interface().(*RootConfig) if !ok { // this is an issue with the code and really should be a panic return true } if fieldKind != reflect.String { // this is an issue with the code and really should be a panic return true } var whenValue string whenValue = field.String() if whenValue == "" { return true } splitString := "=" if strings.Contains(whenValue, "!=") { splitString = "!=" } parts := strings.SplitN(whenValue, splitString, 2) if len(parts) >= 2 { whenValue = parts[0] } return configItemExists(whenValue, root) }
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 (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} }
// 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 }
// 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 "" }
func (e *Encoder) encodeScalar(av *dynamodb.AttributeValue, v reflect.Value, fieldTag tag) error { if v.Type() == numberType { s := v.String() if fieldTag.AsString { av.S = &s } else { av.N = &s } return nil } switch v.Kind() { case reflect.Bool: av.BOOL = new(bool) *av.BOOL = v.Bool() case reflect.String: if err := e.encodeString(av, v); err != nil { return err } default: // Fallback to encoding numbers, will return invalid type if not supported if err := e.encodeNumber(av, v); err != nil { return err } if fieldTag.AsString && av.NULL == nil && av.N != nil { av.S = av.N av.N = nil } } return nil }
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 (w *interpolationWalker) MapElem(m, k, v reflect.Value) error { w.csData = k w.csKey = append(w.csKey, k) w.key = append(w.key, k.String()) w.lastValue = v return nil }
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 (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 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 }
// 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() }
// reflectWithProperType does the opposite thing with setWithProperType. func reflectWithProperType(t reflect.Type, key *Key, field reflect.Value, delim string) error { switch t.Kind() { case reflect.String: key.SetValue(field.String()) case reflect.Bool, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float64, reflectTime: key.SetValue(fmt.Sprint(field)) case reflect.Slice: vals := field.Slice(0, field.Len()) if field.Len() == 0 { return nil } var buf bytes.Buffer isTime := fmt.Sprint(field.Type()) == "[]time.Time" for i := 0; i < field.Len(); i++ { if isTime { buf.WriteString(vals.Index(i).Interface().(time.Time).Format(time.RFC3339)) } else { buf.WriteString(fmt.Sprint(vals.Index(i))) } buf.WriteString(delim) } key.SetValue(buf.String()[:buf.Len()-1]) default: return fmt.Errorf("unsupported type '%s'", t) } return nil }
// 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 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()) }
func defaultReturnHandler() ReturnHandler { return func(ctx *Context, vals []reflect.Value) { rv := ctx.GetVal(inject.InterfaceOf((*http.ResponseWriter)(nil))) resp := rv.Interface().(http.ResponseWriter) var respVal reflect.Value if len(vals) > 1 && vals[0].Kind() == reflect.Int { resp.WriteHeader(int(vals[0].Int())) respVal = vals[1] } else if len(vals) > 0 { respVal = vals[0] if isError(respVal) { err := respVal.Interface().(error) if err != nil { ctx.internalServerError(ctx, err) } return } else if canDeref(respVal) { if respVal.IsNil() { return // Ignore nil error } } } if canDeref(respVal) { respVal = respVal.Elem() } if isByteSlice(respVal) { resp.Write(respVal.Bytes()) } else { resp.Write([]byte(respVal.String())) } } }
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()) }
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 defaultReturnHandler() ReturnHandler { return func(ctx Context, vals []reflect.Value) { rv := ctx.Get(inject.InterfaceOf((*http.ResponseWriter)(nil))) res := rv.Interface().(http.ResponseWriter) var responseVal reflect.Value if len(vals) > 1 && vals[0].Kind() == reflect.Int { res.WriteHeader(int(vals[0].Int())) responseVal = vals[1] } else if len(vals) > 0 { responseVal = vals[0] } if canDeref(responseVal) { responseVal = responseVal.Elem() } if isByteSlice(responseVal) { res.Write(responseVal.Bytes()) } else { jsonBody, err := json.Marshal(responseVal.Interface()) if err != nil { res.Write([]byte(responseVal.String())) } else { res.Write(jsonBody) } } } }
// ComponentExistsValidation will validate that the specified component name is present in the current YAML. func ComponentExistsValidation(v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool { // validates that the component exists in the root.Components slice root, ok := topStruct.Interface().(*RootConfig) if !ok { // this is an issue with the code and really should be a panic return true } if fieldKind != reflect.String { // this is an issue with the code and really should be a panic return true } var componentName string componentName = field.String() parts := strings.SplitN(componentName, ",", 2) if len(parts) >= 2 { componentName = parts[0] } return componentExists(componentName, root) }
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 ContainerNameUnique(v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string) bool { if fieldKind != reflect.String { return true } containerName := field.String() if containerName == "" { return true } if hasReplTemplate(field) { // all bets are off return true } root, ok := topStruct.Interface().(*RootConfig) if !ok { // this is an issue with the code and really should be a panic return true } currentContainer := getCurrentContainer(currentStructOrField) if currentContainer == nil { // this is an issue with the code and really should be a panic return true } container := getContainerFromName(containerName, currentContainer, root) if container != nil { return false } return true }
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 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 }
// Search for a field named 'ID' in the provided struct // - The 'ID' field must be of type Int | String, any other type // results in an error func reflectKey(val reflect.Value) (*Key, error) { if val.Kind() == reflect.Ptr && val.IsNil() { return nil, fmt.Errorf("Key: <nil> pointer of type %s", val.String()) } if val.Kind() == reflect.Ptr { val = Indirect(val) } // TODO: for static-only states (meaning no mutability) // this might be too limiting. if val.Kind() != reflect.Struct { return nil, errors.New("Key: only structs can have a Key") } id_field := val.FieldByName("ID") if !id_field.IsValid() { return nil, fmt.Errorf("%s does not have field with name = 'ID'", val.Type().String()) } switch id_field.Kind() { case reflect.String: return NewStringKey(id_field.String()) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return NewIntKey(int(id_field.Int())) default: return nil, fmt.Errorf("Field 'ID' is of invalid type: %v\n", id_field.Kind()) } }