1package client
2
3import (
4 "net/rpc"
5
6 "github.com/charmbracelet/crush/internal/config"
7 "github.com/charmbracelet/crush/internal/proto"
8 "github.com/charmbracelet/crush/internal/server"
9 msgpackrpc "github.com/hashicorp/net-rpc-msgpackrpc/v2"
10)
11
12// Client represents an RPC client connected to a Crush server.
13type Client struct {
14 rpc *rpc.Client
15}
16
17// DefaultClient creates a new [Client] connected to the default server address.
18func DefaultClient() (*Client, error) {
19 return NewClient("unix", server.DefaultAddr())
20}
21
22// NewClient creates a new [Client] connected to the server at the given
23// network and address.
24func NewClient(network, address string) (*Client, error) {
25 rpc, err := msgpackrpc.Dial(network, address)
26 if err != nil {
27 return nil, err
28 }
29 return &Client{rpc: rpc}, nil
30}
31
32// GetConfig retrieves the server's configuration via RPC.
33func (c *Client) GetConfig() (*config.Config, error) {
34 var cfg config.Config
35 var args proto.Args
36 err := c.rpc.Call("ServerProto.GetConfig", &args, &cfg)
37 if err != nil {
38 return nil, err
39 }
40 return &cfg, nil
41}