gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/server/grpc/util.go (about)

     1  package grpc
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io"
     7  	"os"
     8  	"sync"
     9  
    10  	"google.golang.org/grpc/codes"
    11  )
    12  
    13  // rpcError defines the status from an RPC.
    14  type rpcError struct {
    15  	code codes.Code
    16  	desc string
    17  }
    18  
    19  func (e *rpcError) Error() string {
    20  	return fmt.Sprintf("rpc error: code = %d desc = %s", e.code, e.desc)
    21  }
    22  
    23  // convertCode converts a standard Go error into its canonical code. Note that
    24  // this is only used to translate the error returned by the server applications.
    25  func convertCode(err error) codes.Code {
    26  	switch err {
    27  	case nil:
    28  		return codes.OK
    29  	case io.EOF:
    30  		return codes.OutOfRange
    31  	case io.ErrClosedPipe, io.ErrNoProgress, io.ErrShortBuffer, io.ErrShortWrite, io.ErrUnexpectedEOF:
    32  		return codes.FailedPrecondition
    33  	case os.ErrInvalid:
    34  		return codes.InvalidArgument
    35  	case context.Canceled:
    36  		return codes.Canceled
    37  	case context.DeadlineExceeded:
    38  		return codes.DeadlineExceeded
    39  	}
    40  	switch {
    41  	case os.IsExist(err):
    42  		return codes.AlreadyExists
    43  	case os.IsNotExist(err):
    44  		return codes.NotFound
    45  	case os.IsPermission(err):
    46  		return codes.PermissionDenied
    47  	}
    48  	return codes.Unknown
    49  }
    50  
    51  func wait(ctx context.Context) *sync.WaitGroup {
    52  	if ctx == nil {
    53  		return nil
    54  	}
    55  	wg, ok := ctx.Value("wait").(*sync.WaitGroup)
    56  	if !ok {
    57  		return nil
    58  	}
    59  	return wg
    60  }