1
0
mirror of https://github.com/rancher/norman.git synced 2025-09-11 20:19:28 +00:00

make type conversion and field validation public util methods

This commit is contained in:
Darren Shepherd
2018-07-13 12:59:54 -07:00
parent 58723a866e
commit 1d4a52cb31

View File

@@ -1,6 +1,7 @@
package builder package builder
import ( import (
"errors"
"fmt" "fmt"
"strings" "strings"
@@ -12,11 +13,12 @@ import (
) )
var ( var (
Create = Operation("create") Create = Operation("create")
Update = Operation("update") Update = Operation("update")
Action = Operation("action") Action = Operation("action")
List = Operation("list") List = Operation("list")
ListForCreate = Operation("listcreate") ListForCreate = Operation("listcreate")
ErrComplexType = errors.New("complex type")
) )
type Operation string type Operation string
@@ -32,11 +34,13 @@ type Builder struct {
RefValidator types.ReferenceValidator RefValidator types.ReferenceValidator
edit bool edit bool
export bool export bool
yaml bool
} }
func NewBuilder(apiRequest *types.APIContext) *Builder { func NewBuilder(apiRequest *types.APIContext) *Builder {
return &Builder{ return &Builder{
apiContext: apiRequest, apiContext: apiRequest,
yaml: apiRequest.ResponseFormat == "yaml",
edit: apiRequest.Option("edit") == "true", edit: apiRequest.Option("edit") == "true",
export: apiRequest.Option("export") == "true", export: apiRequest.Option("export") == "true",
Version: apiRequest.Version, Version: apiRequest.Version,
@@ -82,19 +86,19 @@ func (b *Builder) copyInputs(schema *types.Schema, input map[string]interface{},
if sliceValue == nil { if sliceValue == nil {
return httperror.NewFieldAPIError(httperror.NotNullable, fieldName, "Individual array values can not be null") return httperror.NewFieldAPIError(httperror.NotNullable, fieldName, "Individual array values can not be null")
} }
if err := checkFieldCriteria(fieldName, field, sliceValue); err != nil { if err := CheckFieldCriteria(fieldName, field, sliceValue); err != nil {
return err return err
} }
} }
} else { } else {
if err := checkFieldCriteria(fieldName, field, value); err != nil { if err := CheckFieldCriteria(fieldName, field, value); err != nil {
return err return err
} }
} }
} }
result[fieldName] = value result[fieldName] = value
if op.IsList() && field.Type == "date" && value != "" { if op.IsList() && field.Type == "date" && value != "" && !b.edit {
ts, err := convert.ToTimestamp(value) ts, err := convert.ToTimestamp(value)
if err == nil { if err == nil {
result[fieldName+"TS"] = ts result[fieldName+"TS"] = ts
@@ -190,20 +194,32 @@ func (b *Builder) dropDefaultsAndReadOnly(schema *types.Schema, result map[strin
func (b *Builder) populateMissingFieldsForEdit(schema *types.Schema, result map[string]interface{}) { func (b *Builder) populateMissingFieldsForEdit(schema *types.Schema, result map[string]interface{}) {
for name, field := range schema.ResourceFields { for name, field := range schema.ResourceFields {
if !field.Update { if !field.Update {
if name != "name" {
delete(result, name)
}
continue continue
} }
_, hasKey := result[name] desc := field.Description
if len(desc) > 0 {
desc += " "
}
value, hasKey := result[name]
if hasKey { if hasKey {
if field.Default != nil && field.Default == value {
delete(result, name)
result["zzz#("+desc+")("+field.Type+")"+name] = value
}
continue continue
} }
if field.Default != nil { if field.Default != nil {
result[name] = field.Default result["zzz#("+desc+")("+field.Type+")"+name] = field.Default
} else { } else {
val, err := b.convert(field.Type, nil, List) val, err := b.convert(field.Type, nil, List)
if err == nil { if err == nil {
result[name] = val result["zzz#("+desc+")("+field.Type+")"+name] = val
} }
} }
} }
@@ -219,7 +235,7 @@ func (b *Builder) copyFields(schema *types.Schema, input map[string]interface{},
return result, b.checkDefaultAndRequired(schema, input, op, result) return result, b.checkDefaultAndRequired(schema, input, op, result)
} }
func checkFieldCriteria(fieldName string, field types.Field, value interface{}) error { func CheckFieldCriteria(fieldName string, field types.Field, value interface{}) error {
numVal, isNum := value.(int64) numVal, isNum := value.(int64)
strVal := "" strVal := ""
hasStrVal := false hasStrVal := false
@@ -291,20 +307,11 @@ func checkFieldCriteria(fieldName string, field types.Field, value interface{})
return nil return nil
} }
func (b *Builder) convert(fieldType string, value interface{}, op Operation) (interface{}, error) { func ConvertSimple(fieldType string, value interface{}, op Operation) (interface{}, error) {
if value == nil { if value == nil {
return value, nil return value, nil
} }
switch {
case definition.IsMapType(fieldType):
return b.convertMap(fieldType, value, op)
case definition.IsArrayType(fieldType):
return b.convertArray(fieldType, value, op)
case definition.IsReferenceType(fieldType):
return b.convertReferenceType(fieldType, value)
}
switch fieldType { switch fieldType {
case "json": case "json":
return value, nil return value, nil
@@ -372,7 +379,28 @@ func (b *Builder) convert(fieldType string, value interface{}, op Operation) (in
return convert.ToString(value), nil return convert.ToString(value), nil
} }
return b.convertType(fieldType, value, op) return nil, ErrComplexType
}
func (b *Builder) convert(fieldType string, value interface{}, op Operation) (interface{}, error) {
if value == nil {
return value, nil
}
switch {
case definition.IsMapType(fieldType):
return b.convertMap(fieldType, value, op)
case definition.IsArrayType(fieldType):
return b.convertArray(fieldType, value, op)
case definition.IsReferenceType(fieldType):
return b.convertReferenceType(fieldType, value)
}
newValue, err := ConvertSimple(fieldType, value, op)
if err == ErrComplexType {
return b.convertType(fieldType, value, op)
}
return newValue, err
} }
func (b *Builder) convertType(fieldType string, value interface{}, op Operation) (interface{}, error) { func (b *Builder) convertType(fieldType string, value interface{}, op Operation) (interface{}, error) {
@@ -413,7 +441,7 @@ func (b *Builder) convertArray(fieldType string, value interface{}, op Operation
return nil, nil return nil, nil
} }
result := []interface{}{} var result []interface{}
subType := definition.SubType(fieldType) subType := definition.SubType(fieldType)
for _, value := range sliceValue { for _, value := range sliceValue {