1
0
mirror of https://github.com/rancher/norman.git synced 2025-08-01 07:21:07 +00:00

More mappers

This commit is contained in:
Darren Shepherd 2018-02-27 15:18:12 -07:00
parent ef95950ff9
commit ee25c89cfd
3 changed files with 72 additions and 36 deletions

46
types/mapper/batchmove.go Normal file
View File

@ -0,0 +1,46 @@
package mapper
import (
"path"
"github.com/rancher/norman/types"
)
type BatchMove struct {
From []string
To string
DestDefined bool
NoDeleteFromField bool
moves []Move
}
func (b *BatchMove) FromInternal(data map[string]interface{}) {
for _, m := range b.moves {
m.FromInternal(data)
}
}
func (b *BatchMove) ToInternal(data map[string]interface{}) {
for i := len(b.moves) - 1; i >= 0; i++ {
b.moves[i].ToInternal(data)
}
}
func (b *BatchMove) ModifySchema(s *types.Schema, schemas *types.Schemas) error {
for _, from := range b.From {
b.moves = append(b.moves, Move{
From: from,
To: path.Join(b.To, from),
DestDefined: b.DestDefined,
NoDeleteFromField: b.NoDeleteFromField,
})
}
for _, m := range b.moves {
if err := m.ModifySchema(s, schemas); err != nil {
return err
}
}
return nil
}

View File

@ -59,6 +59,7 @@ func (e *Embed) ModifySchema(schema *types.Schema, schemas *types.Schemas) error
return fmt.Errorf("failed to find schema %s for embedding", embeddedSchemaID)
}
deleteField := true
for name, field := range embeddedSchema.ResourceFields {
for _, ignore := range e.Ignore {
if ignore == name {
@ -66,20 +67,29 @@ func (e *Embed) ModifySchema(schema *types.Schema, schemas *types.Schemas) error
}
}
if !e.ignoreOverride {
if _, ok := schema.ResourceFields[name]; ok {
return fmt.Errorf("embedding field %s on %s will overwrite the field %s",
e.Field, schema.ID, name)
if name == e.Field {
deleteField = false
} else {
if !e.ignoreOverride {
if _, ok := schema.ResourceFields[name]; ok {
return fmt.Errorf("embedding field %s on %s will overwrite the field %s",
e.Field, schema.ID, name)
}
}
}
if e.ReadOnly {
field.Create = false
field.Update = false
}
schema.ResourceFields[name] = field
e.embeddedFields = append(e.embeddedFields, name)
}
delete(schema.ResourceFields, e.Field)
if deleteField {
delete(schema.ResourceFields, e.Field)
}
return nil
}

View File

@ -2,47 +2,27 @@ package mapper
import (
"github.com/rancher/norman/types"
"github.com/rancher/norman/types/convert"
)
type Enum struct {
Field string
Values map[string][]string
Field string
Options []string
}
func (e Enum) FromInternal(data map[string]interface{}) {
v, ok := data[e.Field]
if !ok {
return
}
str := convert.ToString(v)
mapping, ok := e.Values[str]
if ok {
data[e.Field] = mapping[0]
} else {
data[e.Field] = v
}
}
func (e Enum) ToInternal(data map[string]interface{}) {
v, ok := data[e.Field]
if !ok {
return
}
str := convert.ToString(v)
for newValue, values := range e.Values {
for _, value := range values {
if str == value {
data[e.Field] = newValue
return
}
}
}
}
func (e Enum) ModifySchema(schema *types.Schema, schemas *types.Schemas) error {
return ValidateField(e.Field, schema)
if err := ValidateField(e.Field, schema); err != nil {
return err
}
f := schema.ResourceFields[e.Field]
f.Type = "enum"
f.Options = e.Options
schema.ResourceFields[e.Field] = f
return nil
}