client.go

 1package client
 2
 3import (
 4	"encoding/json"
 5	"fmt"
 6	"net/http"
 7	"os"
 8
 9	"github.com/charmbracelet/fur/pkg/provider"
10)
11
12const defaultURL = "http://localhost:8080"
13
14// Client represents a client for the fur service
15type Client struct {
16	baseURL    string
17	httpClient *http.Client
18}
19
20// New creates a new client instance
21// Uses FUR_URL environment variable or falls back to localhost:8080
22func New() *Client {
23	baseURL := os.Getenv("FUR_URL")
24	if baseURL == "" {
25		baseURL = defaultURL
26	}
27
28	return &Client{
29		baseURL:    baseURL,
30		httpClient: &http.Client{},
31	}
32}
33
34// NewWithURL creates a new client with a specific URL
35func NewWithURL(url string) *Client {
36	return &Client{
37		baseURL:    url,
38		httpClient: &http.Client{},
39	}
40}
41
42// GetProviders retrieves all available providers from the service
43func (c *Client) GetProviders() ([]provider.Provider, error) {
44	url := fmt.Sprintf("%s/providers", c.baseURL)
45	
46	resp, err := c.httpClient.Get(url)
47	if err != nil {
48		return nil, fmt.Errorf("failed to make request: %w", err)
49	}
50	defer resp.Body.Close()
51
52	if resp.StatusCode != http.StatusOK {
53		return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode)
54	}
55
56	var providers []provider.Provider
57	if err := json.NewDecoder(resp.Body).Decode(&providers); err != nil {
58		return nil, fmt.Errorf("failed to decode response: %w", err)
59	}
60
61	return providers, nil
62}