isle/go/daemon/jsonrpc2/client_rw.go

43 lines
858 B
Go

package jsonrpc2
import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
)
type rwClient struct {
enc *json.Encoder
dec *json.Decoder
}
// NewReadWriterClient returns a Client which will use the given ReadWriter to
// perform requests.
func NewReadWriterClient(rw io.ReadWriter) Client {
return rwClient{json.NewEncoder(rw), json.NewDecoder(rw)}
}
func (c rwClient) Call(
ctx context.Context, rcv any, method string, args ...any,
) error {
id, err := encodeRequest(ctx, c.enc, method, args)
if err != nil {
return fmt.Errorf("encoding request: %w", err)
}
resID, err := decodeResponse(c.dec, rcv)
if errors.As(err, new(Error)) {
return err
} else if err != nil {
return fmt.Errorf("decoding response: %w", err)
} else if resID != id {
return fmt.Errorf(
"expected response with ID %q, got %q", id, resID,
)
}
return nil
}