44package loader
55
66import (
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
5456func 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