Skip to content

Commit a8bc845

Browse files
authored
Merge pull request #3 from MordaTeam/mlti-merge-fix
fix: multi provider merge
2 parents 9c2b1a7 + fa9275f commit a8bc845

File tree

5 files changed

+50
-19
lines changed

5 files changed

+50
-19
lines changed

config.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import (
55
"errors"
66
"fmt"
77
"io"
8-
)
98

10-
type ConfigOption func(*cfgOpts) error
9+
"github.com/MordaTeam/go-toolbox/options"
10+
)
1111

1212
// ConfigProvider is an interface that provides configuration data.
1313
type ConfigProvider interface {
@@ -25,7 +25,7 @@ type cfgOpts struct {
2525
}
2626

2727
// WithDecoder is an option that overrides the default decoder. By default, it uses json.Decoder.
28-
func WithDecoder[D Decoder](newDec func(r io.Reader) D) ConfigOption {
28+
func WithDecoder[D Decoder](newDec func(r io.Reader) D) options.Option[cfgOpts] {
2929
return func(v *cfgOpts) error {
3030
v.newDec = func(r io.Reader) Decoder {
3131
return newDec(r)
@@ -37,7 +37,7 @@ func WithDecoder[D Decoder](newDec func(r io.Reader) D) ConfigOption {
3737
// Creates config T where provider provides data for decoding. By default, it uses json.Decoder.
3838
// Use WithDecoder to override the decoder. If the reader implements the io.Closer interface, then
3939
// it will be closed.
40-
func New[T any](provider ConfigProvider, opts ...ConfigOption) (cfg T, err error) {
40+
func New[T any](provider ConfigProvider, opts ...options.Option[cfgOpts]) (cfg T, err error) {
4141
r, err := provider.ProvideConfig()
4242
if err != nil {
4343
return cfg, fmt.Errorf("provide config: %w", err)
@@ -99,7 +99,7 @@ func New[T any](provider ConfigProvider, opts ...ConfigOption) (cfg T, err error
9999
// err := config.Fill(&cfg, config.FromConsul"/bar/foo"))
100100
// //...
101101
// }
102-
func Fill[T any](cfg *T, provider ConfigProvider, opts ...ConfigOption) error {
102+
func Fill[T any](cfg *T, provider ConfigProvider, opts ...options.Option[cfgOpts]) error {
103103
newCfg, err := New[T](provider, opts...)
104104
if err != nil {
105105
return fmt.Errorf("create config: %w", err)

go.mod

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
module github.com/MordaTeam/go-config
22

3-
go 1.22.12
3+
go 1.24.2
44

55
require (
6+
github.com/MordaTeam/go-toolbox v1.0.0
67
github.com/docker/go-connections v0.5.0
78
github.com/go-ini/ini v1.67.0
89
github.com/stretchr/testify v1.10.0
@@ -68,7 +69,7 @@ require (
6869
go.opentelemetry.io/otel/trace v1.24.0 // indirect
6970
golang.org/x/crypto v0.31.0 // indirect
7071
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect
71-
golang.org/x/sys v0.29.0 // indirect
72+
golang.org/x/sys v0.30.0 // indirect
7273
)
7374

7475
require (

go.sum

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg6
77
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
88
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
99
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
10+
github.com/MordaTeam/go-toolbox v1.0.0 h1:agqL3oJemjgeQo5SqQe8yGQW6jWj+B9+MCcBVzE9Tdg=
11+
github.com/MordaTeam/go-toolbox v1.0.0/go.mod h1:AjOcS/39nz66kFBWbQhjTe24xwC0SLC8zQTJk+obYOE=
1012
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
1113
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
1214
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -150,8 +152,9 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
150152
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
151153
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
152154
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
153-
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
154155
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
156+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
157+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
155158
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
156159
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
157160
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
@@ -345,17 +348,17 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
345348
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
346349
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
347350
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
348-
golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
349-
golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
351+
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
352+
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
350353
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
351354
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
352355
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
353356
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
354357
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
355358
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
356359
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
357-
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
358-
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
360+
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
361+
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
359362
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
360363
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
361364
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -374,8 +377,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:
374377
google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
375378
google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA=
376379
google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0=
377-
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
378-
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
380+
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
381+
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
379382
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
380383
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
381384
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

multi.go

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package config
22

33
import (
4+
"encoding/json"
45
"errors"
56
"fmt"
7+
"io"
8+
9+
"github.com/MordaTeam/go-toolbox/options"
610
)
711

812
type multiConfigurator[T any] struct {
@@ -54,14 +58,16 @@ func (m *multiConfigurator[T]) AllOfFill(cfg *T) (err error) {
5458
}
5559

5660
// Add adds configurator to build config.
57-
func (m *multiConfigurator[T]) Add(provider ConfigProvider, opts ...ConfigOption) *multiConfigurator[T] {
61+
func (m *multiConfigurator[T]) Add(provider ConfigProvider, opts ...options.Option[cfgOpts]) *multiConfigurator[T] {
5862
m.configurators = append(m.configurators, newConfigurator[T](provider, opts...))
5963
return m
6064
}
6165

6266
// Multi creates multi configurator that aggregates different methods of creating config.
6367
// Use method .Add to add configurator, then call .OneOf or .AllOf method to build config.
6468
//
69+
// NOTE: result depends on providers order. If parameter is provided by multiple of them, the last wins.
70+
//
6571
// Example
6672
//
6773
// cfg, err := config.Multi[MyConfig]().
@@ -75,8 +81,29 @@ func Multi[T any]() *multiConfigurator[T] {
7581

7682
type configurator[T any] func(cfg *T) error
7783

78-
func newConfigurator[T any](provider ConfigProvider, opts ...ConfigOption) configurator[T] {
84+
func newConfigurator[T any](provider ConfigProvider, opts ...options.Option[cfgOpts]) configurator[T] {
7985
return func(cfg *T) error {
80-
return Fill(cfg, provider, opts...)
86+
r, err := provider.ProvideConfig()
87+
if err != nil {
88+
return fmt.Errorf("provide config: %w", err)
89+
}
90+
91+
cfgOpts := cfgOpts{
92+
newDec: func(r io.Reader) Decoder {
93+
return json.NewDecoder(r)
94+
},
95+
}
96+
97+
if err := options.ApplyOptions(&cfgOpts, opts...); err != nil {
98+
return fmt.Errorf("init options: %w", err)
99+
}
100+
101+
dec := cfgOpts.newDec(r)
102+
err = dec.Decode(cfg)
103+
if err != nil {
104+
return fmt.Errorf("decode config: %w", err)
105+
}
106+
107+
return nil
81108
}
82109
}

multi_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func TestMulti_AllOf(t *testing.T) {
4848
AllOf()
4949
r.NoError(err)
5050
r.Equal(testMultiConfig{
51-
Foo: "env_foo",
51+
Foo: "file_foo",
5252
Bar: "file_bar",
5353
Port: 8080,
5454
}, cfg)
@@ -63,7 +63,7 @@ func TestMulti_AllOf(t *testing.T) {
6363
AllOf()
6464
r.NoError(err)
6565
r.Equal(testMultiConfig{
66-
Foo: "file_foo",
66+
Foo: "env_foo",
6767
Bar: "file_bar",
6868
Port: 8080,
6969
}, cfg)

0 commit comments

Comments
 (0)