Change summary
pkg/client/client.go | 62 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
Detailed changes
@@ -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
+}