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:
@@ -1,6 +1,7 @@
|
|||||||
package builder
|
package builder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -17,6 +18,7 @@ var (
|
|||||||
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 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 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 {
|
||||||
|
Reference in New Issue
Block a user