@@ -50,7 +50,8 @@ func (p *ResetProcessor) resolveReset(node *yaml.Node, path tree.Path) (*yaml.No
5050 case yaml .SequenceNode :
5151 var err error
5252 for idx , v := range node .Content {
53- node .Content [idx ], err = p .resolveReset (v , path .Next (strconv .Itoa (idx )))
53+ next := path .Next (strconv .Itoa (idx ))
54+ node .Content [idx ], err = p .resolveReset (v , next )
5455 if err != nil {
5556 return nil , err
5657 }
@@ -74,20 +75,6 @@ func (p *ResetProcessor) resolveReset(node *yaml.Node, path tree.Path) (*yaml.No
7475
7576// Apply finds the go attributes matching recorded paths and reset them to zero value
7677func (p * ResetProcessor ) Apply (target * types.Config ) error {
77- for i , path := range p .paths {
78- parts := path .Parts ()
79- // services is a mapping in yaml but a slice in types.Config, so need to translate the paths
80- if len (parts ) > 1 && parts [0 ] == "services" {
81- name := parts [1 ]
82- for idx , service := range target .Services {
83- if service .Name == name {
84- parts [1 ] = fmt .Sprintf ("[%d]" , idx )
85- p .paths [i ] = tree .NewPath (parts ... )
86- break
87- }
88- }
89- }
90- }
9178 return p .applyNullOverrides (reflect .ValueOf (target ), tree .NewPath ())
9279}
9380
@@ -98,8 +85,19 @@ func (p *ResetProcessor) applyNullOverrides(val reflect.Value, path tree.Path) e
9885 return nil
9986 }
10087 typ := val .Type ()
101- switch typ .Kind () {
102- case reflect .Map :
88+ switch {
89+ case path == "services" :
90+ // Project.Services is a slice in compose-go, but a mapping in yaml
91+ for i := 0 ; i < val .Len (); i ++ {
92+ service := val .Index (i )
93+ name := service .FieldByName ("Name" )
94+ next := path .Next (name .String ())
95+ err := p .applyNullOverrides (service , next )
96+ if err != nil {
97+ return err
98+ }
99+ }
100+ case typ .Kind () == reflect .Map :
103101 iter := val .MapRange ()
104102 KEYS:
105103 for iter .Next () {
@@ -113,7 +111,7 @@ func (p *ResetProcessor) applyNullOverrides(val reflect.Value, path tree.Path) e
113111 }
114112 return p .applyNullOverrides (iter .Value (), next )
115113 }
116- case reflect .Slice :
114+ case typ . Kind () == reflect .Slice :
117115 ITER:
118116 for i := 0 ; i < val .Len (); i ++ {
119117 next := path .Next (fmt .Sprintf ("[%d]" , i ))
@@ -127,7 +125,7 @@ func (p *ResetProcessor) applyNullOverrides(val reflect.Value, path tree.Path) e
127125 return p .applyNullOverrides (val .Index (i ), next )
128126 }
129127
130- case reflect .Struct :
128+ case typ . Kind () == reflect .Struct :
131129 FIELDS:
132130 for i := 0 ; i < typ .NumField (); i ++ {
133131 field := typ .Field (i )
0 commit comments