diff --git a/types/mapper/batchmove.go b/types/mapper/batchmove.go new file mode 100644 index 00000000..c0b4b7bb --- /dev/null +++ b/types/mapper/batchmove.go @@ -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 +} diff --git a/types/mapper/embed.go b/types/mapper/embed.go index 86415f1a..fd6ea08d 100644 --- a/types/mapper/embed.go +++ b/types/mapper/embed.go @@ -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 } diff --git a/types/mapper/enum.go b/types/mapper/enum.go index 29b1cdb8..77c7c2da 100644 --- a/types/mapper/enum.go +++ b/types/mapper/enum.go @@ -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 }