@@ -390,6 +390,7 @@ func createTransformHook(additionalTransformers ...Transformer) mapstructure.Dec
390390 reflect .TypeOf (types.DependsOnConfig {}): transformDependsOnConfig ,
391391 reflect .TypeOf (types.ExtendsConfig {}): transformExtendsConfig ,
392392 reflect .TypeOf (types.DeviceRequest {}): transformServiceDeviceRequest ,
393+ reflect .TypeOf (types.SSHConfig {}): transformSSHConfig ,
393394 }
394395
395396 for _ , transformer := range additionalTransformers {
@@ -978,6 +979,35 @@ var transformServiceNetworkMap TransformerFunc = func(value interface{}) (interf
978979 return value , nil
979980}
980981
982+ var transformSSHConfig TransformerFunc = func (data interface {}) (interface {}, error ) {
983+ switch value := data .(type ) {
984+ case map [string ]interface {}:
985+ var result []types.SSHKey
986+ for key , val := range value {
987+ if val == nil {
988+ val = ""
989+ }
990+ result = append (result , types.SSHKey {ID : key , Path : val .(string )})
991+ }
992+ return result , nil
993+ case []interface {}:
994+ var result []types.SSHKey
995+ for _ , v := range value {
996+ key , val := transformValueToMapEntry (v .(string ), "=" , false )
997+ result = append (result , types.SSHKey {ID : key , Path : val .(string )})
998+ }
999+ return result , nil
1000+ case string :
1001+ if value == "" {
1002+ value = "default"
1003+ }
1004+ key , val := transformValueToMapEntry (value , "=" , false )
1005+ result := []types.SSHKey {{ID : key , Path : val .(string )}}
1006+ return result , nil
1007+ }
1008+ return nil , errors .Errorf ("expected a sting, map or a list, got %T: %#v" , data , data )
1009+ }
1010+
9811011var transformStringOrNumberList TransformerFunc = func (value interface {}) (interface {}, error ) {
9821012 list := value .([]interface {})
9831013 result := make ([]string , len (list ))
@@ -1000,47 +1030,52 @@ var transformStringList TransformerFunc = func(data interface{}) (interface{}, e
10001030
10011031func transformMappingOrListFunc (sep string , allowNil bool ) TransformerFunc {
10021032 return func (data interface {}) (interface {}, error ) {
1003- return transformMappingOrList (data , sep , allowNil ), nil
1033+ return transformMappingOrList (data , sep , allowNil )
10041034 }
10051035}
10061036
10071037func transformListOrMappingFunc (sep string , allowNil bool ) TransformerFunc {
10081038 return func (data interface {}) (interface {}, error ) {
1009- return transformListOrMapping (data , sep , allowNil ), nil
1039+ return transformListOrMapping (data , sep , allowNil )
10101040 }
10111041}
10121042
1013- func transformListOrMapping (listOrMapping interface {}, sep string , allowNil bool ) interface {} {
1043+ func transformListOrMapping (listOrMapping interface {}, sep string , allowNil bool ) ( interface {}, error ) {
10141044 switch value := listOrMapping .(type ) {
10151045 case map [string ]interface {}:
1016- return toStringList (value , sep , allowNil )
1046+ return toStringList (value , sep , allowNil ), nil
10171047 case []interface {}:
1018- return listOrMapping
1048+ return listOrMapping , nil
10191049 }
1020- panic ( errors .Errorf ("expected a map or a list, got %T: %#v" , listOrMapping , listOrMapping ) )
1050+ return nil , errors .Errorf ("expected a map or a list, got %T: %#v" , listOrMapping , listOrMapping )
10211051}
10221052
1023- func transformMappingOrList (mappingOrList interface {}, sep string , allowNil bool ) interface {} {
1053+ func transformMappingOrList (mappingOrList interface {}, sep string , allowNil bool ) ( interface {}, error ) {
10241054 switch value := mappingOrList .(type ) {
10251055 case map [string ]interface {}:
1026- return toMapStringString (value , allowNil )
1056+ return toMapStringString (value , allowNil ), nil
10271057 case []interface {}:
10281058 result := make (map [string ]interface {})
10291059 for _ , value := range value {
1030- parts := strings .SplitN (value .(string ), sep , 2 )
1031- key := parts [0 ]
1032- switch {
1033- case len (parts ) == 1 && allowNil :
1034- result [key ] = nil
1035- case len (parts ) == 1 && ! allowNil :
1036- result [key ] = ""
1037- default :
1038- result [key ] = parts [1 ]
1039- }
1060+ key , val := transformValueToMapEntry (value .(string ), sep , allowNil )
1061+ result [key ] = val
10401062 }
1041- return result
1063+ return result , nil
1064+ }
1065+ return nil , errors .Errorf ("expected a map or a list, got %T: %#v" , mappingOrList , mappingOrList )
1066+ }
1067+
1068+ func transformValueToMapEntry (value string , separator string , allowNil bool ) (string , interface {}) {
1069+ parts := strings .SplitN (value , separator , 2 )
1070+ key := parts [0 ]
1071+ switch {
1072+ case len (parts ) == 1 && allowNil :
1073+ return key , nil
1074+ case len (parts ) == 1 && ! allowNil :
1075+ return key , ""
1076+ default :
1077+ return key , parts [1 ]
10421078 }
1043- panic (errors .Errorf ("expected a map or a list, got %T: %#v" , mappingOrList , mappingOrList ))
10441079}
10451080
10461081var transformShellCommand TransformerFunc = func (value interface {}) (interface {}, error ) {
0 commit comments