71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package grpc
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"io"
 | |
| 	"net/http"
 | |
| 	"os"
 | |
| 
 | |
| 	"go.unistack.org/micro/v3/errors"
 | |
| 	"google.golang.org/grpc/codes"
 | |
| )
 | |
| 
 | |
| var errMapping = map[int32]codes.Code{
 | |
| 	http.StatusOK:                  codes.OK,
 | |
| 	http.StatusBadRequest:          codes.InvalidArgument,
 | |
| 	http.StatusRequestTimeout:      codes.DeadlineExceeded,
 | |
| 	http.StatusNotFound:            codes.NotFound,
 | |
| 	http.StatusConflict:            codes.AlreadyExists,
 | |
| 	http.StatusForbidden:           codes.PermissionDenied,
 | |
| 	http.StatusUnauthorized:        codes.Unauthenticated,
 | |
| 	http.StatusPreconditionFailed:  codes.FailedPrecondition,
 | |
| 	http.StatusNotImplemented:      codes.Unimplemented,
 | |
| 	http.StatusInternalServerError: codes.Internal,
 | |
| 	http.StatusServiceUnavailable:  codes.Unavailable,
 | |
| }
 | |
| 
 | |
| // 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 microError(err error) codes.Code {
 | |
| 	if err == nil {
 | |
| 		return codes.OK
 | |
| 	}
 | |
| 
 | |
| 	var ec int32
 | |
| 	if verr, ok := err.(*errors.Error); ok {
 | |
| 		ec = verr.Code
 | |
| 	}
 | |
| 
 | |
| 	if code, ok := errMapping[ec]; ok {
 | |
| 		return code
 | |
| 	}
 | |
| 
 | |
| 	return codes.Unknown
 | |
| }
 |