rpc: make stdio usable over custom channels (#19046)

This commit is contained in:
Martin Holst Swende 2019-02-12 18:05:28 +01:00 committed by GitHub
parent b5d471a739
commit 8771fbf3c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -19,6 +19,7 @@ package rpc
import (
"context"
"errors"
"io"
"net"
"os"
"time"
@ -26,19 +27,30 @@ import (
// DialStdIO creates a client on stdin/stdout.
func DialStdIO(ctx context.Context) (*Client, error) {
return DialIO(ctx, os.Stdin, os.Stdout)
}
// DialIO creates a client which uses the given IO channels
func DialIO(ctx context.Context, in io.Reader, out io.Writer) (*Client, error) {
return newClient(ctx, func(_ context.Context) (ServerCodec, error) {
return NewJSONCodec(stdioConn{}), nil
return NewJSONCodec(stdioConn{
in: in,
out: out,
}), nil
})
}
type stdioConn struct{}
type stdioConn struct {
in io.Reader
out io.Writer
}
func (io stdioConn) Read(b []byte) (n int, err error) {
return os.Stdin.Read(b)
return io.in.Read(b)
}
func (io stdioConn) Write(b []byte) (n int, err error) {
return os.Stdout.Write(b)
return io.out.Write(b)
}
func (io stdioConn) Close() error {