Skip to content

Commit f2a0f5d

Browse files
committed
make Services a map[string]ServiceConfig to reflect yaml structure
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent 593b777 commit f2a0f5d

13 files changed

+251
-286
lines changed

cli/options_windows_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ func TestConvertWithEnvVar(t *testing.T) {
3434
p, err := ProjectFromOptions(opts)
3535

3636
assert.NilError(t, err)
37-
assert.Equal(t, len(p.Services[0].Volumes), 3)
38-
assert.Equal(t, p.Services[0].Volumes[0].Source, "/c/docker/project")
39-
assert.Equal(t, p.Services[0].Volumes[1].Source, "/c/project-dir/relative")
40-
assert.Equal(t, p.Services[0].Volumes[2].Source, "/c/project-dir/relative2")
37+
volumes := p.Services["test"].Volumes
38+
assert.Equal(t, len(volumes), 3)
39+
assert.Equal(t, volumes[0].Source, "/c/docker/project")
40+
assert.Equal(t, volumes[1].Source, "/c/project-dir/relative")
41+
assert.Equal(t, volumes[2].Source, "/c/project-dir/relative2")
4142
}

loader/full-struct_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ func fullExampleProject(workingDir, homeDir string) *types.Project {
4444
}
4545
}
4646

47-
func services(workingDir, homeDir string) []types.ServiceConfig {
48-
return []types.ServiceConfig{
49-
{
47+
func services(workingDir, homeDir string) types.Services {
48+
return types.Services{
49+
"foo": {
5050
Name: "foo",
5151

5252
Annotations: map[string]string{
@@ -436,7 +436,7 @@ func services(workingDir, homeDir string) []types.ServiceConfig {
436436
},
437437
WorkingDir: "/code",
438438
},
439-
{
439+
"bar": {
440440
Name: "bar",
441441
Build: &types.BuildConfig{
442442
Context: workingDir,

loader/loader.go

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -580,8 +580,8 @@ func Transform(source interface{}, target interface{}) error {
580580
data := mapstructure.Metadata{}
581581
config := &mapstructure.DecoderConfig{
582582
DecodeHook: mapstructure.ComposeDecodeHookFunc(
583+
nameServices,
583584
decoderHook,
584-
makeServiceSlice,
585585
cast),
586586
Result: target,
587587
TagName: "yaml",
@@ -594,21 +594,16 @@ func Transform(source interface{}, target interface{}) error {
594594
return decoder.Decode(source)
595595
}
596596

597-
func makeServiceSlice(from reflect.Value, to reflect.Value) (interface{}, error) {
597+
// nameServices create implicit `name` key for convenience accessing service
598+
func nameServices(from reflect.Value, to reflect.Value) (interface{}, error) {
598599
if to.Type() == reflect.TypeOf(types.Services{}) {
599-
keys := from.MapKeys()
600-
services := make([]any, len(keys))
601-
i := 0
602-
for _, key := range keys {
603-
service := from.MapIndex(key).Elem()
604-
if service.Kind() != reflect.Map {
605-
return nil, fmt.Errorf("unexpected service type %T", service)
606-
}
607-
service.SetMapIndex(reflect.ValueOf("name"), key)
608-
services[i] = service.Interface()
609-
i++
600+
nameK := reflect.ValueOf("name")
601+
iter := from.MapRange()
602+
for iter.Next() {
603+
name := iter.Key()
604+
elem := iter.Value()
605+
elem.Elem().SetMapIndex(nameK, name)
610606
}
611-
return services, nil
612607
}
613608
return from.Interface(), nil
614609
}

0 commit comments

Comments
 (0)