Spaces:
Configuration error
Configuration error
package clients | |
import ( | |
"bytes" | |
"encoding/json" | |
"fmt" | |
"io" | |
"net/http" | |
) | |
// Define a struct to hold the store API client | |
type StoreClient struct { | |
BaseURL string | |
Client *http.Client | |
} | |
type SetRequest struct { | |
Keys [][]float32 `json:"keys"` | |
Values []string `json:"values"` | |
} | |
type GetRequest struct { | |
Keys [][]float32 `json:"keys"` | |
} | |
type GetResponse struct { | |
Keys [][]float32 `json:"keys"` | |
Values []string `json:"values"` | |
} | |
type DeleteRequest struct { | |
Keys [][]float32 `json:"keys"` | |
} | |
type FindRequest struct { | |
TopK int `json:"topk"` | |
Key []float32 `json:"key"` | |
} | |
type FindResponse struct { | |
Keys [][]float32 `json:"keys"` | |
Values []string `json:"values"` | |
Similarities []float32 `json:"similarities"` | |
} | |
// Constructor for StoreClient | |
func NewStoreClient(baseUrl string) *StoreClient { | |
return &StoreClient{ | |
BaseURL: baseUrl, | |
Client: &http.Client{}, | |
} | |
} | |
// Implement Set method | |
func (c *StoreClient) Set(req SetRequest) error { | |
return c.doRequest("stores/set", req) | |
} | |
// Implement Get method | |
func (c *StoreClient) Get(req GetRequest) (*GetResponse, error) { | |
body, err := c.doRequestWithResponse("stores/get", req) | |
if err != nil { | |
return nil, err | |
} | |
var resp GetResponse | |
err = json.Unmarshal(body, &resp) | |
if err != nil { | |
return nil, err | |
} | |
return &resp, nil | |
} | |
// Implement Delete method | |
func (c *StoreClient) Delete(req DeleteRequest) error { | |
return c.doRequest("stores/delete", req) | |
} | |
// Implement Find method | |
func (c *StoreClient) Find(req FindRequest) (*FindResponse, error) { | |
body, err := c.doRequestWithResponse("stores/find", req) | |
if err != nil { | |
return nil, err | |
} | |
var resp FindResponse | |
err = json.Unmarshal(body, &resp) | |
if err != nil { | |
return nil, err | |
} | |
return &resp, nil | |
} | |
// Helper function to perform a request without expecting a response body | |
func (c *StoreClient) doRequest(path string, data interface{}) error { | |
jsonData, err := json.Marshal(data) | |
if err != nil { | |
return err | |
} | |
req, err := http.NewRequest("POST", c.BaseURL+"/"+path, bytes.NewBuffer(jsonData)) | |
if err != nil { | |
return err | |
} | |
req.Header.Set("Content-Type", "application/json") | |
resp, err := c.Client.Do(req) | |
if err != nil { | |
return err | |
} | |
defer resp.Body.Close() | |
if resp.StatusCode != http.StatusOK { | |
return fmt.Errorf("API request to %s failed with status code %d", path, resp.StatusCode) | |
} | |
return nil | |
} | |
// Helper function to perform a request and parse the response body | |
func (c *StoreClient) doRequestWithResponse(path string, data interface{}) ([]byte, error) { | |
jsonData, err := json.Marshal(data) | |
if err != nil { | |
return nil, err | |
} | |
req, err := http.NewRequest("POST", c.BaseURL+"/"+path, bytes.NewBuffer(jsonData)) | |
if err != nil { | |
return nil, err | |
} | |
req.Header.Set("Content-Type", "application/json") | |
resp, err := c.Client.Do(req) | |
if err != nil { | |
return nil, err | |
} | |
defer resp.Body.Close() | |
if resp.StatusCode != http.StatusOK { | |
return nil, fmt.Errorf("API request to %s failed with status code %d", path, resp.StatusCode) | |
} | |
body, err := io.ReadAll(resp.Body) | |
if err != nil { | |
return nil, err | |
} | |
return body, nil | |
} | |