diff --git a/types/mapping/mapper/move.go b/types/mapping/mapper/move.go index 2016b82e..607f9499 100644 --- a/types/mapping/mapper/move.go +++ b/types/mapping/mapper/move.go @@ -10,7 +10,9 @@ import ( ) type Move struct { - From, To string + From, To string + DestDefined bool + NoDeleteFromField bool } func (m Move) FromInternal(data map[string]interface{}) { @@ -26,22 +28,12 @@ func (m Move) ToInternal(data map[string]interface{}) { } func (m Move) ModifySchema(s *types.Schema, schemas *types.Schemas) error { - internalSchema, err := getInternal(s) - if err != nil { - return err - } - - _, _, fromInternalField, ok, err := getField(internalSchema, schemas, m.From) + fromSchema, _, fromField, ok, err := getField(s, schemas, m.From) if err != nil { return err } if !ok { - return fmt.Errorf("missing field %s on internal schema %s", m.From, internalSchema.ID) - } - - fromSchema, _, _, _, err := getField(s, schemas, m.From) - if err != nil { - return err + return fmt.Errorf("failed to find field %s on schema %s", m.From, s.ID) } toSchema, toFieldName, toField, ok, err := getField(s, schemas, m.To) @@ -49,14 +41,18 @@ func (m Move) ModifySchema(s *types.Schema, schemas *types.Schemas) error { return err } _, ok = toSchema.ResourceFields[toFieldName] - if ok && !strings.Contains(m.To, "/") { + if ok && !strings.Contains(m.To, "/") && !m.DestDefined { return fmt.Errorf("field %s already exists on schema %s", m.To, s.ID) } - delete(fromSchema.ResourceFields, m.From) + if !m.NoDeleteFromField { + delete(fromSchema.ResourceFields, m.From) + } - toField.CodeName = convert.Capitalize(toFieldName) - toSchema.ResourceFields[toFieldName] = fromInternalField + if !m.DestDefined { + toField.CodeName = convert.Capitalize(toFieldName) + toSchema.ResourceFields[toFieldName] = fromField + } return nil } diff --git a/types/mapping/mapper/set_value.go b/types/mapping/mapper/set_value.go new file mode 100644 index 00000000..4f9b553b --- /dev/null +++ b/types/mapping/mapper/set_value.go @@ -0,0 +1,49 @@ +package mapper + +import ( + "fmt" + + "strings" + + "github.com/rancher/norman/types" +) + +type SetValue struct { + From, To string + Value interface{} + IfEq interface{} +} + +func (s SetValue) FromInternal(data map[string]interface{}) { + v, ok := GetValue(data, strings.Split(s.From, "/")...) + if !ok { + return + } + + if v == s.IfEq { + PutValue(data, s.Value, strings.Split(s.To, "/")...) + } +} + +func (s SetValue) ToInternal(data map[string]interface{}) { + v, ok := GetValue(data, strings.Split(s.To, "/")...) + if !ok { + return + } + + if v == s.Value { + PutValue(data, s.IfEq, strings.Split(s.From, "/")...) + } +} + +func (s SetValue) ModifySchema(schema *types.Schema, schemas *types.Schemas) error { + _, _, _, ok, err := getField(schema, schemas, s.To) + if err != nil { + return err + } + if !ok { + return fmt.Errorf("failed to find defined field for %s on schemas %s", s.To, schema.ID) + } + + return nil +}