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