Skip to content

Commit b777cff

Browse files
committed
feat: support collate requests
1 parent f85a444 commit b777cff

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

go/client/sock/client.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ type QueryListRequest struct {
4747
Intersect bool `msgpack:"intersect,omitempty"`
4848
}
4949

50+
type GetCollateRequest struct {
51+
Key string `msgpack:"key,omitempty"`
52+
}
53+
54+
type QueryCollateRequest struct {
55+
Query map[string]any `msgpack:"query"`
56+
Key string `msgpack:"key,omitempty"`
57+
Intersect bool `msgpack:"intersect,omitempty"`
58+
}
59+
5060
type singleResponse struct {
5161
File any `msgpack:"file"`
5262
PrevFileName string `msgpack:"prev_file_name"`
@@ -151,6 +161,44 @@ func (c *Client) runSingleRequest(singleReq any, tag string) (*singleResponse, e
151161
}
152162
}
153163

164+
func (c *Client) runCollateRequest(collateReq any, tag string) ([]string, error) {
165+
conn, err := net.Dial("unix", c.socketPath)
166+
if err != nil {
167+
return nil, fmt.Errorf("Failed to dial: %w", err)
168+
}
169+
defer conn.Close()
170+
171+
req := taggedRequest{
172+
Tag: tag,
173+
Value: collateReq,
174+
}
175+
176+
enc := msgpack.NewEncoder(conn)
177+
if err := enc.Encode(req); err != nil {
178+
return nil, fmt.Errorf("Failed to encode request: %w", err)
179+
}
180+
181+
var resp *taggedResponse
182+
dec := msgpack.NewDecoder(conn)
183+
if err := dec.Decode(&resp); err != nil {
184+
return nil, fmt.Errorf("Failed to decode response: %w", err)
185+
}
186+
187+
switch resp.Tag {
188+
case "Ok":
189+
var collateResp []string
190+
err := msgpack.Unmarshal(resp.Value, &collateResp)
191+
if err != nil {
192+
return nil, fmt.Errorf("Could not unmarshal response value: %w", err)
193+
}
194+
return collateResp, nil
195+
case "InternalServerError":
196+
return nil, fmt.Errorf("Custard had internal server error")
197+
default:
198+
return nil, fmt.Errorf("Unrecognised tag from server: %s", resp.Tag)
199+
}
200+
}
201+
154202
func (c *Client) GetSingle(req GetSingleRequest) (*singleResponse, error) {
155203
return c.runSingleRequest(req, "SingleGet")
156204
}
@@ -166,3 +214,11 @@ func (c *Client) GetList(req GetListRequest) ([]listResponse, error) {
166214
func (c *Client) QueryList(req QueryListRequest) ([]listResponse, error) {
167215
return c.runListRequest(req, "ListQuery")
168216
}
217+
218+
func (c *Client) GetCollate(req GetCollateRequest) ([]string, error) {
219+
return c.runCollateRequest(req, "CollateGet")
220+
}
221+
222+
func (c *Client) QueryCollate(req QueryCollateRequest) ([]string, error) {
223+
return c.runCollateRequest(req, "CollateQuery")
224+
}

go/client/sock/test/client_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package sock_test
22

33
import (
4+
"slices"
45
"testing"
56

67
"github.com/Teajey/custard/go/client/sock"
@@ -87,3 +88,32 @@ func TestQueryList(t *testing.T) {
8788
t.Fatalf("Unexpected response length: %d", respLen)
8889
}
8990
}
91+
92+
func TestGetCollate(t *testing.T) {
93+
client := sock.NewClient("/tmp/custard")
94+
resp, err := client.GetCollate(sock.GetCollateRequest{
95+
Key: "tags",
96+
})
97+
if err != nil {
98+
t.Fatalf("Request failed: %s", err)
99+
}
100+
expected := []string{"code", "music", "ramble", "sketch", "travel"}
101+
if !slices.Equal(expected, resp) {
102+
t.Fatalf("Expected %v but got %v", expected, resp)
103+
}
104+
}
105+
106+
func TestQueryCollate(t *testing.T) {
107+
client := sock.NewClient("/tmp/custard")
108+
resp, err := client.QueryCollate(sock.QueryCollateRequest{
109+
Key: "tags",
110+
Query: map[string]any{"tags": []string{"code"}},
111+
})
112+
if err != nil {
113+
t.Fatalf("Request failed: %s", err)
114+
}
115+
expected := []string{"code", "sketch"}
116+
if !slices.Equal(expected, resp) {
117+
t.Fatalf("Expected %v but got %v", expected, resp)
118+
}
119+
}

0 commit comments

Comments
 (0)