Skip to content

Commit 6fe35dc

Browse files
committed
added sync support in multiple files
Signed-off-by: Moshe Beladev <[email protected]>
1 parent 9175919 commit 6fe35dc

File tree

5 files changed

+77
-29
lines changed

5 files changed

+77
-29
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ __debug_bin
33
flagd
44
.vscode
55
dist/
6+
.idea
67

78
# ignore generated code
89
pkg/generated/*.gen.*

cmd/start.go

+26-21
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ var (
2323
serviceProvider string
2424
syncProvider string
2525
evaluator string
26-
uri string
26+
uri []string
2727
httpServicePort int32
2828
socketServicePath string
2929
bearerToken string
@@ -46,26 +46,30 @@ func findService(name string) (service.IService, error) {
4646
return v, nil
4747
}
4848

49-
func findSync(name string) (sync.ISync, error) {
50-
registeredSync := map[string]sync.ISync{
51-
"filepath": &sync.FilePathSync{
52-
URI: uri,
53-
},
54-
"remote": &sync.HTTPSync{
55-
URI: uri,
56-
BearerToken: bearerToken,
57-
Client: &http.Client{
58-
Timeout: time.Second * 10,
49+
func findSync(name string) ([]sync.ISync, error) {
50+
results := make([]sync.ISync, 0, len(uri))
51+
for _, u := range uri {
52+
registeredSync := map[string]sync.ISync{
53+
"filepath": &sync.FilePathSync{
54+
URI: u,
5955
},
60-
},
61-
}
62-
v, ok := registeredSync[name]
63-
if !ok {
64-
return nil, errors.New("no sync-provider set")
56+
"remote": &sync.HTTPSync{
57+
URI: u,
58+
BearerToken: bearerToken,
59+
Client: &http.Client{
60+
Timeout: time.Second * 10,
61+
},
62+
},
63+
}
64+
v, ok := registeredSync[name]
65+
if !ok {
66+
return nil, errors.New("no sync-provider set")
67+
}
68+
results = append(results, v)
69+
log.Debugf("Using %s sync-provider on %q\n", name, u)
6570
}
6671

67-
log.Debugf("Using %s sync-provider\n", name)
68-
return v, nil
72+
return results, nil
6973
}
7074

7175
func findEvaluator(name string) (eval.IEvaluator, error) {
@@ -98,7 +102,7 @@ var startCmd = &cobra.Command{
98102
serviceImpl = foundService
99103

100104
// Configure sync-provider impl--------------------------------------------
101-
var syncImpl sync.ISync
105+
var syncImpl []sync.ISync
102106
foundSync, err := findSync(syncProvider)
103107
if err != nil {
104108
log.Errorf("Unable to find sync '%s'", syncProvider)
@@ -148,8 +152,9 @@ func init() {
148152
&syncProvider, "sync-provider", "y", "filepath", "Set a sync provider e.g. filepath or remote")
149153
startCmd.Flags().StringVarP(
150154
&evaluator, "evaluator", "e", "json", "Set an evaluator e.g. json")
151-
startCmd.Flags().StringVarP(
152-
&uri, "uri", "f", "", "Set a sync provider uri to read data from this can be a filepath or url")
155+
startCmd.Flags().StringSliceVarP(
156+
&uri, "uri", "f", []string{}, "Set a sync provider uri to read data from this can be a filepath or url")
157+
153158
startCmd.Flags().StringVarP(
154159
&bearerToken, "bearer-token", "b", "", "Set a bearer token to use for remote sync")
155160

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"flags": {
3+
"myBoolFlag": {
4+
"state": "ENABLED",
5+
"variants": {
6+
"on": true,
7+
"off": false
8+
},
9+
"defaultVariant": "off"
10+
},
11+
"isColorGreen": {
12+
"state": "ENABLED",
13+
"variants": {
14+
"on": true,
15+
"off": false
16+
},
17+
"defaultVariant": "off",
18+
"targeting": {
19+
"if": [
20+
{
21+
"==": [
22+
{
23+
"var": [
24+
"color"
25+
]
26+
},
27+
"yellow"
28+
]
29+
},
30+
"on",
31+
"off"
32+
]
33+
}
34+
}
35+
}
36+
}

pkg/eval/json_evaluator.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func (je *JSONEvaluator) SetState(state string) error {
5050
if err != nil {
5151
return fmt.Errorf("unmarshal new state: %w", err)
5252
}
53-
je.state.Merge(newFlags)
53+
je.state = je.state.Merge(newFlags)
5454

5555
return nil
5656
}

pkg/runtime/runtime.go

+13-7
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,19 @@ func updateState(syncr sync.ISync) error {
2626
return nil
2727
}
2828

29-
func Start(ctx context.Context, syncr sync.ISync, server service.IService, evaluator eval.IEvaluator) {
30-
ev = evaluator
31-
29+
func startSyncer(ctx context.Context, notifier chan sync.INotify, syncr sync.ISync) {
3230
if err := updateState(syncr); err != nil {
3331
log.Error(err)
3432
}
3533

36-
syncNotifier := make(chan sync.INotify)
37-
38-
go syncr.Notify(syncNotifier)
34+
go syncr.Notify(notifier)
3935

4036
go func() {
4137
for {
4238
select {
4339
case <-ctx.Done():
4440
return
45-
case w := <-syncNotifier:
41+
case w := <-notifier:
4642
switch w.GetEvent().EventType {
4743
case sync.EEventTypeCreate:
4844
log.Info("New configuration created")
@@ -60,6 +56,16 @@ func Start(ctx context.Context, syncr sync.ISync, server service.IService, evalu
6056
}
6157
}
6258
}()
59+
}
60+
61+
func Start(ctx context.Context, syncr []sync.ISync, server service.IService, evaluator eval.IEvaluator) {
62+
ev = evaluator
63+
64+
syncNotifier := make(chan sync.INotify)
65+
66+
for _, s := range syncr {
67+
startSyncer(ctx, syncNotifier, s)
68+
}
6369

6470
go func() { _ = server.Serve(ctx, ev) }()
6571
}

0 commit comments

Comments
 (0)