Skip to content

Commit 53a4dca

Browse files
Add list contain function
1 parent 80134f1 commit 53a4dca

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

pkg/client/list/list.go

+23
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"context"
1919
"encoding/base64"
2020
"errors"
21+
2122
"github.com/atomix/api/proto/atomix/headers"
2223
api "github.com/atomix/api/proto/atomix/list"
2324
"github.com/atomix/go-client/pkg/client/primitive"
@@ -58,6 +59,9 @@ type List interface {
5859
// Len gets the length of the list
5960
Len(ctx context.Context) (int, error)
6061

62+
// Contains checks whether the list contains a value
63+
Contains(ctx context.Context, value []byte) (bool, error)
64+
6165
// Slice returns a slice of the list from the given start index to the given end index
6266
Slice(ctx context.Context, from int, to int) (List, error)
6367

@@ -258,6 +262,25 @@ func (l *list) Remove(ctx context.Context, index int) ([]byte, error) {
258262
}
259263
}
260264

265+
func (l *list) Contains(ctx context.Context, value []byte) (bool, error) {
266+
response, err := l.instance.DoQuery(ctx, func(ctx context.Context, conn *grpc.ClientConn, header *headers.RequestHeader) (*headers.ResponseHeader, interface{}, error) {
267+
client := api.NewListServiceClient(conn)
268+
request := &api.ContainsRequest{
269+
Header: header,
270+
Value: base64.StdEncoding.EncodeToString(value),
271+
}
272+
response, err := client.Contains(ctx, request)
273+
if err != nil {
274+
return nil, nil, err
275+
}
276+
return response.Header, response, nil
277+
})
278+
if err != nil {
279+
return false, err
280+
}
281+
return bool(response.(*api.ContainsResponse).Contains), nil
282+
}
283+
261284
func (l *list) Len(ctx context.Context) (int, error) {
262285
response, err := l.instance.DoQuery(ctx, func(ctx context.Context, conn *grpc.ClientConn, header *headers.RequestHeader) (*headers.ResponseHeader, interface{}, error) {
263286
client := api.NewListServiceClient(conn)

pkg/client/list/list_test.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ package list
1616

1717
import (
1818
"context"
19+
"testing"
20+
1921
"github.com/atomix/go-client/pkg/client/primitive"
2022
"github.com/atomix/go-client/pkg/client/test"
2123
"github.com/stretchr/testify/assert"
22-
"testing"
2324
)
2425

2526
func TestListOperations(t *testing.T) {
@@ -53,6 +54,10 @@ func TestListOperations(t *testing.T) {
5354
assert.NoError(t, err)
5455
assert.Equal(t, "foo", string(value))
5556

57+
contain, err := list.Contains(context.TODO(), []byte("foo"))
58+
assert.NoError(t, err)
59+
assert.Equal(t, true, contain)
60+
5661
err = list.Append(context.TODO(), []byte("bar"))
5762
assert.NoError(t, err)
5863

pkg/client/list/slice.go

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package list
1717
import (
1818
"context"
1919
"errors"
20+
2021
"github.com/atomix/go-client/pkg/client/primitive"
2122
)
2223

@@ -96,6 +97,11 @@ func (l *slicedList) Len(ctx context.Context) (int, error) {
9697
return size, nil
9798
}
9899

100+
func (l *slicedList) Contains(ctx context.Context, value []byte) (bool, error) {
101+
contain, err := l.list.Contains(ctx, value)
102+
return contain, err
103+
}
104+
99105
func (l *slicedList) Slice(ctx context.Context, from int, to int) (List, error) {
100106
if l.from != nil {
101107
from += *l.from

0 commit comments

Comments
 (0)