61 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package grpc
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"os"
 | |
| 	"sync"
 | |
| 
 | |
| 	"google.golang.org/grpc/codes"
 | |
| )
 | |
| 
 | |
| // rpcError defines the status from an RPC.
 | |
| type rpcError struct {
 | |
| 	code codes.Code
 | |
| 	desc string
 | |
| }
 | |
| 
 | |
| func (e *rpcError) Error() string {
 | |
| 	return fmt.Sprintf("rpc error: code = %d desc = %s", e.code, e.desc)
 | |
| }
 | |
| 
 | |
| // convertCode converts a standard Go error into its canonical code. Note that
 | |
| // this is only used to translate the error returned by the server applications.
 | |
| func convertCode(err error) codes.Code {
 | |
| 	switch err {
 | |
| 	case nil:
 | |
| 		return codes.OK
 | |
| 	case io.EOF:
 | |
| 		return codes.OutOfRange
 | |
| 	case io.ErrClosedPipe, io.ErrNoProgress, io.ErrShortBuffer, io.ErrShortWrite, io.ErrUnexpectedEOF:
 | |
| 		return codes.FailedPrecondition
 | |
| 	case os.ErrInvalid:
 | |
| 		return codes.InvalidArgument
 | |
| 	case context.Canceled:
 | |
| 		return codes.Canceled
 | |
| 	case context.DeadlineExceeded:
 | |
| 		return codes.DeadlineExceeded
 | |
| 	}
 | |
| 	switch {
 | |
| 	case os.IsExist(err):
 | |
| 		return codes.AlreadyExists
 | |
| 	case os.IsNotExist(err):
 | |
| 		return codes.NotFound
 | |
| 	case os.IsPermission(err):
 | |
| 		return codes.PermissionDenied
 | |
| 	}
 | |
| 	return codes.Unknown
 | |
| }
 | |
| 
 | |
| func wait(ctx context.Context) *sync.WaitGroup {
 | |
| 	if ctx == nil {
 | |
| 		return nil
 | |
| 	}
 | |
| 	wg, ok := ctx.Value("wait").(*sync.WaitGroup)
 | |
| 	if !ok {
 | |
| 		return nil
 | |
| 	}
 | |
| 	return wg
 | |
| }
 |