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}