Skip to content

Commit 8228fa8

Browse files
committed
Add kind selection
1 parent d9fdfb6 commit 8228fa8

File tree

3 files changed

+85
-1
lines changed

3 files changed

+85
-1
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package events
2+
3+
type Base struct {
4+
Kind string `json:"kind"`
5+
}
6+
7+
type Filter struct {
8+
Kind *string
9+
}
10+
11+
func (f Filter) Matches(e Base) bool {
12+
if f.Kind == nil {
13+
return true
14+
}
15+
return e.Kind == *f.Kind
16+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package events
2+
3+
import (
4+
"github.com/samber/lo"
5+
"github.com/stretchr/testify/assert"
6+
"testing"
7+
)
8+
9+
func TestFilterMatches(t *testing.T) {
10+
testCases := []struct {
11+
name string
12+
filter Filter
13+
event Base
14+
expected bool
15+
}{
16+
{
17+
name: "no filter matches",
18+
filter: Filter{},
19+
event: Base{Kind: "kind"},
20+
expected: true,
21+
},
22+
{
23+
name: "filter kind matches",
24+
filter: Filter{Kind: lo.ToPtr("kind")},
25+
event: Base{Kind: "kind"},
26+
expected: true,
27+
},
28+
{
29+
name: "filter kind does not match",
30+
filter: Filter{Kind: lo.ToPtr("kind")},
31+
event: Base{Kind: "other"},
32+
expected: false,
33+
},
34+
}
35+
for _, tc := range testCases {
36+
t.Run(tc.name, func(t *testing.T) {
37+
assert.Equal(t, tc.expected, tc.filter.Matches(tc.event))
38+
})
39+
}
40+
}

internal/dev_server/sdk/sdk_events.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,40 @@ import (
66
"log"
77
"net/http"
88

9+
"github.com/launchdarkly/ldcli/internal/dev_server/events"
910
"github.com/launchdarkly/ldcli/internal/dev_server/model"
1011
"github.com/pkg/errors"
1112
)
1213

14+
func newSdkEventObserver(updateChan chan<- Message, filter events.Filter) sdkEventObserver {
15+
return sdkEventObserver{
16+
updateChan: updateChan,
17+
filter: filter,
18+
}
19+
}
20+
1321
type sdkEventObserver struct {
1422
updateChan chan<- Message
23+
filter events.Filter
1524
}
1625

1726
func (o sdkEventObserver) Handle(message interface{}) {
1827
str, ok := message.(json.RawMessage)
1928
if !ok {
2029
return
2130
}
31+
32+
event := events.Base{}
33+
err := json.Unmarshal(str, &event)
34+
if err != nil {
35+
log.Printf("sdkEventObserver: error unmarshaling event: %v", err)
36+
return
37+
}
38+
39+
if !o.filter.Matches(event) {
40+
return
41+
}
42+
2243
o.updateChan <- Message{Event: TYPE_PUT, Data: str}
2344
}
2445

@@ -53,8 +74,15 @@ func SdkEventsTeeHandler(writer http.ResponseWriter, request *http.Request) {
5374
Message{Event: TYPE_PUT, Data: []byte{}},
5475
)
5576
defer close(updateChan)
77+
filter := events.Filter{}
78+
79+
query := request.URL.Query()
80+
kind := query.Get("kind")
81+
if kind != "" {
82+
filter.Kind = &kind
83+
}
5684

57-
observerId := observers.RegisterObserver(sdkEventObserver{updateChan})
85+
observerId := observers.RegisterObserver(newSdkEventObserver(updateChan, filter))
5886
defer func() {
5987
ok := observers.DeregisterObserver(observerId)
6088
if !ok {

0 commit comments

Comments
 (0)