瀏覽代碼

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

Martin Holst Swende 6 年之前
父節點
當前提交
8771fbf3c8
共有 1 個文件被更改,包括 16 次插入4 次删除
  1. 16 4
      rpc/stdio.go

+ 16 - 4
rpc/stdio.go

@@ -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 {