Codebase list golang-github-go-kit-kit / 78fd391 addsvc / netrpc_binding.go
78fd391

Tree @78fd391 (Download .tar.gz)

netrpc_binding.go @78fd391raw · history · blame

package main

import (
	"golang.org/x/net/context"

	"github.com/go-kit/kit/addsvc/reqrep"
	"github.com/go-kit/kit/endpoint"
)

// NetrpcBinding makes an endpoint usable over net/rpc. It needs to be
// exported to be picked up by net/rpc.
type NetrpcBinding struct {
	ctx context.Context // has methods which should not be made available
	endpoint.Endpoint
}

// Add implements the net/rpc method definition.
func (b NetrpcBinding) Add(request reqrep.AddRequest, response *reqrep.AddResponse) error {
	var (
		ctx, cancel = context.WithCancel(b.ctx)
		errs        = make(chan error, 1)
		responses   = make(chan reqrep.AddResponse, 1)
	)
	defer cancel()
	go func() {
		resp, err := b.Endpoint(ctx, request)
		if err != nil {
			errs <- err
			return
		}
		addResp, ok := resp.(reqrep.AddResponse)
		if !ok {
			errs <- endpoint.ErrBadCast
			return
		}
		responses <- addResp
	}()
	select {
	case <-ctx.Done():
		return context.DeadlineExceeded
	case err := <-errs:
		return err
	case resp := <-responses:
		(*response) = resp
		return nil
	}
}