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}