Skip to content

Commit 78458e1

Browse files
committed
cli/compose/loader: mergeServices: tidy up and modernize
- construct merge-opts as a slice - remove intermediate var for overrideServices - use slices.SortFunc for sorting Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
1 parent 09cf89e commit 78458e1

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

cli/compose/loader/merge.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44
package loader
55

66
import (
7+
"cmp"
78
"fmt"
89
"reflect"
10+
"slices"
911
"sort"
1012

1113
"dario.cat/mergo"
@@ -52,10 +54,10 @@ func merge(configs []*types.Config) (*types.Config, error) {
5254
}
5355

5456
func mergeServices(base, override []types.ServiceConfig) ([]types.ServiceConfig, error) {
55-
baseServices := mapByName(base)
56-
overrideServices := mapByName(override)
57-
specials := &specials{
58-
m: map[reflect.Type]func(dst, src reflect.Value) error{
57+
mergeOpts := []func(*mergo.Config){
58+
mergo.WithAppendSlice,
59+
mergo.WithOverride,
60+
mergo.WithTransformers(&specials{m: map[reflect.Type]func(dst, src reflect.Value) error{
5961
reflect.PointerTo(reflect.TypeFor[types.LoggingConfig]()): safelyMerge(mergeLoggingConfig),
6062
reflect.TypeFor[[]types.ServicePortConfig](): mergeSlice(toServicePortConfigsMap, toServicePortConfigsSlice),
6163
reflect.TypeFor[[]types.ServiceSecretConfig](): mergeSlice(toServiceSecretConfigsMap, toServiceSecretConfigsSlice),
@@ -65,23 +67,30 @@ func mergeServices(base, override []types.ServiceConfig) ([]types.ServiceConfig,
6567
reflect.TypeFor[types.ShellCommand](): mergeShellCommand,
6668
reflect.PointerTo(reflect.TypeFor[types.ServiceNetworkConfig]()): mergeServiceNetworkConfig,
6769
reflect.PointerTo(reflect.TypeFor[uint64]()): mergeUint64,
68-
},
70+
}}),
6971
}
70-
for name, overrideService := range overrideServices {
72+
73+
baseServices := mapByName(base)
74+
for name, overrideService := range mapByName(override) {
7175
if baseService, ok := baseServices[name]; ok {
72-
if err := mergo.Merge(&baseService, &overrideService, mergo.WithAppendSlice, mergo.WithOverride, mergo.WithTransformers(specials)); err != nil {
76+
if err := mergo.Merge(&baseService, &overrideService, mergeOpts...); err != nil {
7377
return base, fmt.Errorf("cannot merge service %s: %w", name, err)
7478
}
7579
baseServices[name] = baseService
7680
continue
7781
}
7882
baseServices[name] = overrideService
7983
}
84+
8085
services := make([]types.ServiceConfig, 0, len(baseServices))
8186
for _, baseService := range baseServices {
8287
services = append(services, baseService)
8388
}
84-
sort.Slice(services, func(i, j int) bool { return services[i].Name < services[j].Name })
89+
90+
slices.SortFunc(services, func(a, b types.ServiceConfig) int {
91+
return cmp.Compare(a.Name, b.Name)
92+
})
93+
8594
return services, nil
8695
}
8796

0 commit comments

Comments
 (0)