From 5e3e678a9b677094741e4329d7200f460df0daeb Mon Sep 17 00:00:00 2001 From: Kujtim Hoxha Date: Wed, 25 Jun 2025 13:03:51 +0200 Subject: [PATCH] feat: add a client --- pkg/client/client.go | 62 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 pkg/client/client.go diff --git a/pkg/client/client.go b/pkg/client/client.go new file mode 100644 index 0000000000000000000000000000000000000000..85eedd261218e3196177b36bbd381da2291fcc2b --- /dev/null +++ b/pkg/client/client.go @@ -0,0 +1,62 @@ +package client + +import ( + "encoding/json" + "fmt" + "net/http" + "os" + + "github.com/charmbracelet/fur/pkg/provider" +) + +const defaultURL = "http://localhost:8080" + +// Client represents a client for the fur service +type Client struct { + baseURL string + httpClient *http.Client +} + +// New creates a new client instance +// Uses FUR_URL environment variable or falls back to localhost:8080 +func New() *Client { + baseURL := os.Getenv("FUR_URL") + if baseURL == "" { + baseURL = defaultURL + } + + return &Client{ + baseURL: baseURL, + httpClient: &http.Client{}, + } +} + +// NewWithURL creates a new client with a specific URL +func NewWithURL(url string) *Client { + return &Client{ + baseURL: url, + httpClient: &http.Client{}, + } +} + +// GetProviders retrieves all available providers from the service +func (c *Client) GetProviders() ([]provider.Provider, error) { + url := fmt.Sprintf("%s/providers", c.baseURL) + + resp, err := c.httpClient.Get(url) + if err != nil { + return nil, fmt.Errorf("failed to make request: %w", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + var providers []provider.Provider + if err := json.NewDecoder(resp.Body).Decode(&providers); err != nil { + return nil, fmt.Errorf("failed to decode response: %w", err) + } + + return providers, nil +} \ No newline at end of file