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
 | 
						|
}
 |