1
0
mirror of https://github.com/rancher/norman.git synced 2025-08-31 23:02:01 +00:00
Files
norman/types/mapper.go

179 lines
4.3 KiB
Go
Raw Normal View History

2017-11-10 21:44:02 -07:00
package types
import (
2017-11-28 14:28:25 -07:00
"fmt"
2017-12-29 15:09:30 -07:00
"github.com/rancher/norman/types/convert"
2017-11-10 21:44:02 -07:00
"github.com/rancher/norman/types/definition"
"github.com/rancher/norman/types/values"
2017-11-10 21:44:02 -07:00
)
type Mapper interface {
FromInternal(data map[string]interface{})
2018-06-04 16:48:22 -07:00
ToInternal(data map[string]interface{}) error
2017-11-10 21:44:02 -07:00
ModifySchema(schema *Schema, schemas *Schemas) error
}
2017-11-21 13:46:30 -07:00
type Mappers []Mapper
func (m Mappers) FromInternal(data map[string]interface{}) {
for _, mapper := range m {
mapper.FromInternal(data)
}
}
2018-06-04 16:48:22 -07:00
func (m Mappers) ToInternal(data map[string]interface{}) error {
var errors []error
2017-11-21 13:46:30 -07:00
for i := len(m) - 1; i >= 0; i-- {
2018-06-04 16:48:22 -07:00
errors = append(errors, m[i].ToInternal(data))
2017-11-21 13:46:30 -07:00
}
2018-06-04 16:48:22 -07:00
return NewErrors(errors...)
2017-11-21 13:46:30 -07:00
}
func (m Mappers) ModifySchema(schema *Schema, schemas *Schemas) error {
for _, mapper := range m {
if err := mapper.ModifySchema(schema, schemas); err != nil {
return err
}
}
return nil
}
type typeMapper struct {
2017-11-10 21:44:02 -07:00
Mappers []Mapper
root bool
2017-11-10 21:44:02 -07:00
typeName string
subSchemas map[string]*Schema
subArraySchemas map[string]*Schema
2018-06-04 16:48:22 -07:00
subMapSchemas map[string]*Schema
2017-11-10 21:44:02 -07:00
}
2017-11-21 13:46:30 -07:00
func (t *typeMapper) FromInternal(data map[string]interface{}) {
name, _ := values.GetValueN(data, "metadata", "name").(string)
namespace, _ := values.GetValueN(data, "metadata", "namespace").(string)
2017-11-10 21:44:02 -07:00
for fieldName, schema := range t.subSchemas {
if schema.Mapper == nil {
continue
}
fieldData, _ := data[fieldName].(map[string]interface{})
schema.Mapper.FromInternal(fieldData)
}
2018-06-04 16:48:22 -07:00
for fieldName, schema := range t.subMapSchemas {
if schema.Mapper == nil {
continue
}
datas, _ := data[fieldName].(map[string]interface{})
for _, fieldData := range datas {
mapFieldData, _ := fieldData.(map[string]interface{})
schema.Mapper.FromInternal(mapFieldData)
}
}
2017-11-10 21:44:02 -07:00
for fieldName, schema := range t.subArraySchemas {
if schema.Mapper == nil {
continue
}
datas, _ := data[fieldName].([]interface{})
for _, fieldData := range datas {
mapFieldData, _ := fieldData.(map[string]interface{})
schema.Mapper.FromInternal(mapFieldData)
}
}
if _, ok := data["type"]; !ok && data != nil {
data["type"] = t.typeName
}
2018-06-04 16:48:22 -07:00
Mappers(t.Mappers).FromInternal(data)
if data != nil && t.root {
if _, ok := data["id"]; ok {
if namespace != "" {
id, _ := data["id"].(string)
data["id"] = namespace + ":" + id
}
} else {
2017-11-21 13:46:30 -07:00
if name != "" {
if namespace == "" {
data["id"] = name
} else {
data["id"] = namespace + ":" + name
}
}
}
2017-11-10 21:44:02 -07:00
}
2018-07-31 10:47:02 -07:00
if _, ok := data["type"]; !ok && data != nil {
if _, ok := data["id"]; ok {
data["type"] = t.typeName
}
}
2017-11-10 21:44:02 -07:00
}
2018-06-04 16:48:22 -07:00
func (t *typeMapper) ToInternal(data map[string]interface{}) error {
errors := Errors{}
errors.Add(Mappers(t.Mappers).ToInternal(data))
2017-11-10 21:44:02 -07:00
for fieldName, schema := range t.subArraySchemas {
if schema.Mapper == nil {
continue
}
2017-12-29 15:09:30 -07:00
datas, _ := data[fieldName].([]interface{})
2017-11-10 21:44:02 -07:00
for _, fieldData := range datas {
2018-06-04 16:48:22 -07:00
errors.Add(schema.Mapper.ToInternal(convert.ToMapInterface(fieldData)))
}
}
for fieldName, schema := range t.subMapSchemas {
if schema.Mapper == nil {
continue
}
datas, _ := data[fieldName].(map[string]interface{})
for _, fieldData := range datas {
errors.Add(schema.Mapper.ToInternal(convert.ToMapInterface(fieldData)))
2017-11-10 21:44:02 -07:00
}
}
for fieldName, schema := range t.subSchemas {
if schema.Mapper == nil {
continue
}
fieldData, _ := data[fieldName].(map[string]interface{})
2018-06-04 16:48:22 -07:00
errors.Add(schema.Mapper.ToInternal(fieldData))
2017-11-10 21:44:02 -07:00
}
2018-06-04 16:48:22 -07:00
return errors.Err()
2017-11-10 21:44:02 -07:00
}
2017-11-21 13:46:30 -07:00
func (t *typeMapper) ModifySchema(schema *Schema, schemas *Schemas) error {
2017-11-10 21:44:02 -07:00
t.subSchemas = map[string]*Schema{}
t.subArraySchemas = map[string]*Schema{}
2018-06-04 16:48:22 -07:00
t.subMapSchemas = map[string]*Schema{}
2017-11-28 14:28:25 -07:00
t.typeName = fmt.Sprintf("%s/schemas/%s", schema.Version.Path, schema.ID)
2017-11-10 21:44:02 -07:00
mapperSchema := schema
if schema.InternalSchema != nil {
mapperSchema = schema.InternalSchema
}
for name, field := range mapperSchema.ResourceFields {
fieldType := field.Type
targetMap := t.subSchemas
if definition.IsArrayType(fieldType) {
fieldType = definition.SubType(fieldType)
targetMap = t.subArraySchemas
2018-06-04 16:48:22 -07:00
} else if definition.IsMapType(fieldType) {
fieldType = definition.SubType(fieldType)
targetMap = t.subMapSchemas
2017-11-10 21:44:02 -07:00
}
schema := schemas.Schema(&schema.Version, fieldType)
if schema != nil {
targetMap[name] = schema
}
}
2017-11-21 13:46:30 -07:00
return Mappers(t.Mappers).ModifySchema(schema, schemas)
2017-11-10 21:44:02 -07:00
}