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 }