@@ -7,66 +7,71 @@ import (
7
7
8
8
err "github.com/open-feature/go-sdk-contrib/providers/multi-provider/internal"
9
9
10
- of "github.com/open-feature/go-sdk/openfeature"
11
- ofhooks "github.com/open-feature/go-sdk/openfeature/hooks"
10
+ "github.com/open-feature/go-sdk/openfeature"
11
+ "github.com/open-feature/go-sdk/openfeature/hooks"
12
12
)
13
13
14
14
var (
15
- errUniqueName = errors .New ("Provider names must be unique. " )
15
+ errUniqueName = errors .New ("provider names must be unique" )
16
16
)
17
17
18
18
// UniqueNameProvider allows for a unique name to be assigned to a provider during a multi-provider set up.
19
19
// The name will be used when reporting errors & results to specify the provider associated.
20
20
type UniqueNameProvider struct {
21
- Provider of .FeatureProvider
22
- Name string
21
+ Provider openfeature .FeatureProvider
22
+ UniqueName string
23
23
}
24
24
25
25
// MultiMetadata defines the return of the MultiProvider metadata with the aggregated data of all the providers.
26
26
type MultiMetadata struct {
27
27
Name string
28
- OriginalMetadata map [string ]of .Metadata
28
+ OriginalMetadata map [string ]openfeature .Metadata
29
29
}
30
30
31
31
// MultiProvider implements openfeature `FeatureProvider` in a way to accept an array of providers.
32
32
type MultiProvider struct {
33
33
providersEntries []UniqueNameProvider
34
34
providersEntriesByName map [string ]UniqueNameProvider
35
- AggregatedMetadata map [string ]of .Metadata
35
+ AggregatedMetadata map [string ]openfeature .Metadata
36
36
EvaluationStrategy string
37
- events chan of .Event
38
- status of .State
37
+ events chan openfeature .Event
38
+ status openfeature .State
39
39
mu sync.Mutex
40
40
}
41
41
42
42
// NewMultiProvider returns the unified interface of multiple providers for interaction.
43
- func NewMultiProvider (passedProviders []UniqueNameProvider , evaluationStrategy string , logger ofhooks .LoggingHook ) (* MultiProvider , error ) {
43
+ func NewMultiProvider (passedProviders []UniqueNameProvider , evaluationStrategy string , logger * hooks .LoggingHook ) (* MultiProvider , error ) {
44
44
multiProvider := & MultiProvider {
45
45
providersEntries : []UniqueNameProvider {},
46
46
providersEntriesByName : map [string ]UniqueNameProvider {},
47
- AggregatedMetadata : map [string ]of .Metadata {},
47
+ AggregatedMetadata : map [string ]openfeature .Metadata {},
48
48
}
49
49
50
50
err := registerProviders (multiProvider , passedProviders )
51
51
if err != nil {
52
52
return nil , err
53
53
}
54
54
55
- // err = multiProvider.Init(of.EvaluationContext{})
56
- // if err != nil {
57
- // return nil, err
58
- // }
59
-
60
55
return multiProvider , nil
61
56
}
62
57
58
+ func (mp * MultiProvider ) Providers () []UniqueNameProvider {
59
+ return mp .providersEntries
60
+ }
61
+
62
+ func (mp * MultiProvider ) ProvidersByName () []UniqueNameProvider {
63
+ return mp .providersEntries
64
+ }
65
+
66
+ func (mp * MultiProvider ) ProviderByName (name string ) (UniqueNameProvider , bool ) {
67
+ provider , exists := mp .providersEntriesByName [name ]
68
+ return provider , exists
69
+ }
70
+
63
71
// Metadata provides the name `multiprovider` and the names of each provider passed.
64
- func (mp * MultiProvider ) Metadata () MultiMetadata {
72
+ func (mp * MultiProvider ) Metadata () openfeature. Metadata {
65
73
66
- return MultiMetadata {
67
- Name : "multiprovider" ,
68
- OriginalMetadata : mp .AggregatedMetadata ,
69
- }
74
+ return openfeature.Metadata {Name : "multiprovider" }
70
75
}
71
76
72
77
// registerProviders ensures that when setting up an instant of MultiProvider the providers provided either have a unique name or the base `metadata.Name` is made unique by adding an indexed based number to it.
@@ -75,7 +80,7 @@ func registerProviders(mp *MultiProvider, providers []UniqueNameProvider) error
75
80
providersByName := make (map [string ][]UniqueNameProvider )
76
81
77
82
for _ , provider := range providers {
78
- uniqueName := provider .Name
83
+ uniqueName := provider .UniqueName
79
84
80
85
if _ , exists := providersByName [uniqueName ]; exists {
81
86
return errUniqueName
@@ -90,12 +95,14 @@ func registerProviders(mp *MultiProvider, providers []UniqueNameProvider) error
90
95
91
96
for name , providers := range providersByName {
92
97
if len (providers ) == 1 {
98
+ providers [0 ].UniqueName = name
93
99
mp .providersEntries = append (mp .providersEntries , providers [0 ])
94
100
mp .providersEntriesByName [name ] = providers [0 ]
95
101
mp .AggregatedMetadata [name ] = providers [0 ].Provider .Metadata ()
96
102
} else {
97
103
for i , provider := range providers {
98
104
uniqueName := fmt .Sprintf ("%s-%d" , name , i + 1 )
105
+ provider .UniqueName = uniqueName
99
106
mp .providersEntries = append (mp .providersEntries , provider )
100
107
mp .providersEntriesByName [uniqueName ] = provider
101
108
mp .AggregatedMetadata [uniqueName ] = provider .Provider .Metadata ()
@@ -106,17 +113,17 @@ func registerProviders(mp *MultiProvider, providers []UniqueNameProvider) error
106
113
}
107
114
108
115
// Init will run the initialize method for all of provides and aggregate the errors.
109
- func (mp * MultiProvider ) Init (evalCtx of .EvaluationContext ) error {
116
+ func (mp * MultiProvider ) Init (evalCtx openfeature .EvaluationContext ) error {
110
117
var wg sync.WaitGroup
111
118
errChan := make (chan err.StateErr , len (mp .providersEntries ))
112
119
113
120
for _ , provider := range mp .providersEntries {
114
121
wg .Add (1 )
115
122
go func (p UniqueNameProvider ) {
116
123
defer wg .Done ()
117
- if stateHandle , ok := p .Provider .(of .StateHandler ); ok {
124
+ if stateHandle , ok := p .Provider .(openfeature .StateHandler ); ok {
118
125
if initErr := stateHandle .Init (evalCtx ); initErr != nil {
119
- errChan <- err.StateErr {ProviderName : p .Name , Err : initErr }
126
+ errChan <- err.StateErr {ProviderName : p .UniqueName , Err : initErr }
120
127
}
121
128
}
122
129
}(provider )
@@ -141,8 +148,8 @@ func (mp *MultiProvider) Init(evalCtx of.EvaluationContext) error {
141
148
return nil
142
149
}
143
150
144
- func (mp * MultiProvider ) Status () of .State {
145
- return of .ReadyState
151
+ func (mp * MultiProvider ) Status () openfeature .State {
152
+ return openfeature .ReadyState
146
153
}
147
154
148
155
func (mp * MultiProvider ) Shutdown () {
@@ -152,7 +159,7 @@ func (mp *MultiProvider) Shutdown() {
152
159
wg .Add (1 )
153
160
go func (p UniqueNameProvider ) {
154
161
defer wg .Done ()
155
- if stateHandle , ok := p .Provider .(of .StateHandler ); ok {
162
+ if stateHandle , ok := p .Provider .(openfeature .StateHandler ); ok {
156
163
stateHandle .Shutdown ()
157
164
}
158
165
}(provider )
@@ -161,7 +168,7 @@ func (mp *MultiProvider) Shutdown() {
161
168
wg .Wait ()
162
169
}
163
170
164
- func (mp * MultiProvider ) EventChannel () <- chan of .Event {
165
- ev := make (chan of .Event )
171
+ func (mp * MultiProvider ) EventChannel () <- chan openfeature .Event {
172
+ ev := make (chan openfeature .Event )
166
173
return ev
167
174
}
0 commit comments