@@ -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,24 @@ 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+ return toMapStringString (value , true ), nil
986+ case []interface {}:
987+ return transformMappingOrList (value , "=" , true )
988+ case string :
989+ result := make (map [string ]interface {})
990+ if value == "" {
991+ value = "default"
992+ }
993+ key , val := transformValueToMapEntry (value , "=" , true )
994+ result [key ] = val
995+ return result , nil
996+ }
997+ return nil , errors .Errorf ("expected a sting, map or a list, got %T: %#v" , data , data )
998+ }
999+
9811000var transformStringOrNumberList TransformerFunc = func (value interface {}) (interface {}, error ) {
9821001 list := value .([]interface {})
9831002 result := make ([]string , len (list ))
@@ -1000,47 +1019,52 @@ var transformStringList TransformerFunc = func(data interface{}) (interface{}, e
10001019
10011020func transformMappingOrListFunc (sep string , allowNil bool ) TransformerFunc {
10021021 return func (data interface {}) (interface {}, error ) {
1003- return transformMappingOrList (data , sep , allowNil ), nil
1022+ return transformMappingOrList (data , sep , allowNil )
10041023 }
10051024}
10061025
10071026func transformListOrMappingFunc (sep string , allowNil bool ) TransformerFunc {
10081027 return func (data interface {}) (interface {}, error ) {
1009- return transformListOrMapping (data , sep , allowNil ), nil
1028+ return transformListOrMapping (data , sep , allowNil )
10101029 }
10111030}
10121031
1013- func transformListOrMapping (listOrMapping interface {}, sep string , allowNil bool ) interface {} {
1032+ func transformListOrMapping (listOrMapping interface {}, sep string , allowNil bool ) ( interface {}, error ) {
10141033 switch value := listOrMapping .(type ) {
10151034 case map [string ]interface {}:
1016- return toStringList (value , sep , allowNil )
1035+ return toStringList (value , sep , allowNil ), nil
10171036 case []interface {}:
1018- return listOrMapping
1037+ return listOrMapping , nil
10191038 }
1020- panic ( errors .Errorf ("expected a map or a list, got %T: %#v" , listOrMapping , listOrMapping ) )
1039+ return nil , errors .Errorf ("expected a map or a list, got %T: %#v" , listOrMapping , listOrMapping )
10211040}
10221041
1023- func transformMappingOrList (mappingOrList interface {}, sep string , allowNil bool ) interface {} {
1042+ func transformMappingOrList (mappingOrList interface {}, sep string , allowNil bool ) ( interface {}, error ) {
10241043 switch value := mappingOrList .(type ) {
10251044 case map [string ]interface {}:
1026- return toMapStringString (value , allowNil )
1045+ return toMapStringString (value , allowNil ), nil
10271046 case []interface {}:
10281047 result := make (map [string ]interface {})
10291048 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- }
1049+ key , val := transformValueToMapEntry (value .(string ), sep , allowNil )
1050+ result [key ] = val
10401051 }
1041- return result
1052+ return result , nil
1053+ }
1054+ return nil , errors .Errorf ("expected a map or a list, got %T: %#v" , mappingOrList , mappingOrList )
1055+ }
1056+
1057+ func transformValueToMapEntry (value string , separator string , allowNil bool ) (string , interface {}) {
1058+ parts := strings .SplitN (value , separator , 2 )
1059+ key := parts [0 ]
1060+ switch {
1061+ case len (parts ) == 1 && allowNil :
1062+ return key , nil
1063+ case len (parts ) == 1 && ! allowNil :
1064+ return key , ""
1065+ default :
1066+ return key , parts [1 ]
10421067 }
1043- panic (errors .Errorf ("expected a map or a list, got %T: %#v" , mappingOrList , mappingOrList ))
10441068}
10451069
10461070var transformShellCommand TransformerFunc = func (value interface {}) (interface {}, error ) {
0 commit comments