Skip to content

Commit 69e269b

Browse files
authored
fix: Update changeset builder to support chaining calls (#333)
1 parent ca33a3c commit 69e269b

File tree

7 files changed

+35
-53
lines changed

7 files changed

+35
-53
lines changed

internal/datasourcev2/fdv1_polling_data_source.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,14 @@ func (r *fdv1ToFDv2Requester) Request(
3434
}
3535

3636
changeSetBuilder := subsystems.NewChangeSetBuilder()
37-
err = changeSetBuilder.Start(subsystems.ServerIntent{
37+
changeSetBuilder.Start(subsystems.ServerIntent{
3838
Payload: subsystems.Payload{
3939
ID: "arbitrary-id",
4040
Target: 0,
4141
Code: code,
4242
Reason: reason,
4343
},
4444
})
45-
if err != nil {
46-
return nil, headers, err
47-
}
4845

4946
for _, item := range data {
5047
kind := subsystems.FlagKind

internal/datasourcev2/polling_http_request.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import (
55
"encoding/json"
66
"fmt"
77
"io"
8+
"maps"
89
"net/http"
910
"net/url"
1011

11-
"maps"
12-
1312
"github.com/gregjones/httpcache"
1413

1514
"github.com/launchdarkly/go-sdk-common/v3/ldlog"
@@ -106,9 +105,7 @@ func (r *pollingRequester) Request(
106105
if serverIntent.Payload.Code == subsystems.IntentNone {
107106
return changeSet.NoChanges(), headers, nil
108107
}
109-
if err := changeSet.Start(serverIntent); err != nil {
110-
return nil, headers, err
111-
}
108+
changeSet.Start(serverIntent)
112109
case subsystems.EventPutObject:
113110
var put subsystems.PutObject
114111
if err := json.Unmarshal(event.Data, &put); err != nil {

internal/datasourcev2/streaming_data_source.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"encoding/json"
66
"errors"
7+
"maps"
78
"net/http"
89
"net/url"
910
"sync"
@@ -21,8 +22,6 @@ import (
2122
"github.com/launchdarkly/go-server-sdk/v7/internal/datasource"
2223
"github.com/launchdarkly/go-server-sdk/v7/internal/endpoints"
2324
"github.com/launchdarkly/go-server-sdk/v7/subsystems"
24-
25-
"maps"
2625
)
2726

2827
const (
@@ -205,10 +204,7 @@ func (sp *StreamProcessor) consumeStream(stream *es.Stream, resultChan chan<- su
205204
break
206205
}
207206

208-
if err := changeSetBuilder.Start(serverIntent); err != nil {
209-
gotMalformedEvent(event, err)
210-
break
211-
}
207+
changeSetBuilder.Start(serverIntent)
212208

213209
// IntentNone is a special case where we won't receive a payload-transferred event, so we will need
214210
// to instead immediately notify the client that we are initialized.

ldfiledatav2/file_data_source_impl.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -305,17 +305,14 @@ func mergeFileData(
305305
allFileData ...fileData,
306306
) (*subsystems.ChangeSet, error) {
307307
builder := subsystems.NewChangeSetBuilder()
308-
err := builder.Start(subsystems.ServerIntent{
308+
builder.Start(subsystems.ServerIntent{
309309
Payload: subsystems.Payload{
310310
ID: "",
311311
Target: version,
312312
Code: subsystems.IntentTransferFull,
313313
Reason: "payload-missing",
314314
},
315315
})
316-
if err != nil {
317-
return nil, fmt.Errorf("error starting change set: %w", err)
318-
}
319316

320317
seenKeys := map[subsystems.ObjectKind]map[string]bool{
321318
subsystems.FlagKind: {},

subsystems/changeset.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,10 @@ func (c *ChangeSetBuilder) Empty(selector Selector) *ChangeSet {
183183
}
184184

185185
// Start begins a new change set with a given intent.
186-
func (c *ChangeSetBuilder) Start(intent ServerIntent) error {
186+
func (c *ChangeSetBuilder) Start(intent ServerIntent) *ChangeSetBuilder {
187187
c.intent = &intent
188188
c.changes = nil
189-
return nil
189+
return c
190190
}
191191

192192
// ExpectChanges ensures that the current ChangeSetBuilder is prepared to handle changes.
@@ -239,22 +239,26 @@ func (c *ChangeSetBuilder) Finish(selector Selector) (*ChangeSet, error) {
239239
}
240240

241241
// AddPut adds a new object to the changeset.
242-
func (c *ChangeSetBuilder) AddPut(kind ObjectKind, key string, version int, object json.RawMessage) {
242+
func (c *ChangeSetBuilder) AddPut(kind ObjectKind, key string, version int, object json.RawMessage) *ChangeSetBuilder {
243243
c.changes = append(c.changes, Change{
244244
Action: ChangeTypePut,
245245
Kind: kind,
246246
Key: key,
247247
Version: version,
248248
Object: object,
249249
})
250+
251+
return c
250252
}
251253

252254
// AddDelete adds a deletion to the changeset.
253-
func (c *ChangeSetBuilder) AddDelete(kind ObjectKind, key string, version int) {
255+
func (c *ChangeSetBuilder) AddDelete(kind ObjectKind, key string, version int) *ChangeSetBuilder {
254256
c.changes = append(c.changes, Change{
255257
Action: ChangeTypeDelete,
256258
Kind: kind,
257259
Key: key,
258260
Version: version,
259261
})
262+
263+
return c
260264
}

subsystems/changeset_test.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,15 @@ func TestChangeSetBuilder_MustStartToFinish(t *testing.T) {
1818
_, err := builder.Finish(selector)
1919
assert.Error(t, err)
2020

21-
assert.NoError(t, builder.Start(ServerIntent{Payload: Payload{Code: IntentNone}}))
21+
builder.Start(ServerIntent{Payload: Payload{Code: IntentNone}})
2222

2323
_, err = builder.Finish(selector)
2424
assert.NoError(t, err)
2525
}
2626

2727
func TestChangeSetBuilder_Changes(t *testing.T) {
2828
builder := NewChangeSetBuilder()
29-
err := builder.Start(ServerIntent{Payload: Payload{Code: IntentTransferChanges}})
30-
assert.NoError(t, err)
29+
builder.Start(ServerIntent{Payload: Payload{Code: IntentTransferChanges}})
3130

3231
builder.AddPut("foo", "bar", 1, []byte("baz"))
3332
builder.AddDelete("foo", "bar", 1)
@@ -44,7 +43,6 @@ func TestChangeSetBuilder_Changes(t *testing.T) {
4443

4544
assert.Equal(t, IntentTransferChanges, changeSet.IntentCode())
4645
assert.Equal(t, selector, changeSet.Selector())
47-
4846
}
4947

5048
// After receiving an intent, the SDK may receive 1 or more objects before receiving a payload-transferred.
@@ -54,8 +52,7 @@ func TestChangeSetBuilder_Changes(t *testing.T) {
5452
// send one.
5553
func TestChangeSetBuilder_ImplicitIntentXferChanges(t *testing.T) {
5654
builder := NewChangeSetBuilder()
57-
err := builder.Start(ServerIntent{Payload: Payload{Code: IntentTransferFull}})
58-
assert.NoError(t, err)
55+
builder.Start(ServerIntent{Payload: Payload{Code: IntentTransferFull}})
5956

6057
changes1, err := builder.Finish(NewSelector("foo", 1))
6158
assert.NoError(t, err)

testhelpers/ldtestdatav2/test_data_source.go

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -205,18 +205,15 @@ func (t *TestDataSynchronizer) makeFullTransferChangeset() (*subsystems.ChangeSe
205205
version := t.version
206206
t.version++
207207

208-
builder := subsystems.NewChangeSetBuilder()
209-
err := builder.Start(subsystems.ServerIntent{
210-
Payload: subsystems.Payload{
211-
ID: "",
212-
Target: version,
213-
Code: subsystems.IntentTransferFull,
214-
Reason: "payload-missing",
215-
},
216-
})
217-
if err != nil {
218-
return nil, err
219-
}
208+
builder := subsystems.NewChangeSetBuilder().
209+
Start(subsystems.ServerIntent{
210+
Payload: subsystems.Payload{
211+
ID: "",
212+
Target: version,
213+
Code: subsystems.IntentTransferFull,
214+
Reason: "payload-missing",
215+
},
216+
})
220217

221218
for key, item := range t.currentFlags {
222219
json, err := json.Marshal(item.Item)
@@ -246,18 +243,15 @@ func (t *TestDataSynchronizer) makeTransferChangesForObject(
246243
version := t.version
247244
t.version++
248245

249-
builder := subsystems.NewChangeSetBuilder()
250-
err := builder.Start(subsystems.ServerIntent{
251-
Payload: subsystems.Payload{
252-
ID: "",
253-
Target: version,
254-
Code: subsystems.IntentTransferChanges,
255-
Reason: "changes",
256-
},
257-
})
258-
if err != nil {
259-
return nil, err
260-
}
246+
builder := subsystems.NewChangeSetBuilder().
247+
Start(subsystems.ServerIntent{
248+
Payload: subsystems.Payload{
249+
ID: "",
250+
Target: version,
251+
Code: subsystems.IntentTransferChanges,
252+
Reason: "changes",
253+
},
254+
})
261255

262256
json, err := json.Marshal(item.Item)
263257
if err != nil {

0 commit comments

Comments
 (0)