Skip to content

Commit

Permalink
rpc: make stdio usable over custom channels (ethereum#19046)
Browse files Browse the repository at this point in the history
  • Loading branch information
holiman authored Feb 12, 2019
1 parent b5d471a commit 8771fbf
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions rpc/stdio.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,38 @@ package rpc
import (
"context"
"errors"
"io"
"net"
"os"
"time"
)

// 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 {
Expand Down

0 comments on commit 8771fbf

Please sign in to comment.