github.com/annwntech/go-micro/v2@v2.9.5/client/grpc/error.go (about)

     1  package grpc
     2  
     3  import (
     4  	"github.com/annwntech/go-micro/v2/errors"
     5  	"google.golang.org/grpc/status"
     6  )
     7  
     8  func microError(err error) error {
     9  	// no error
    10  	switch err {
    11  	case nil:
    12  		return nil
    13  	}
    14  
    15  	if verr, ok := err.(*errors.Error); ok {
    16  		return verr
    17  	}
    18  
    19  	// grpc error
    20  	s, ok := status.FromError(err)
    21  	if !ok {
    22  		return err
    23  	}
    24  
    25  	// return first error from details
    26  	if details := s.Details(); len(details) > 0 {
    27  		return microError(details[0].(error))
    28  	}
    29  
    30  	// try to decode micro *errors.Error
    31  	if e := errors.Parse(s.Message()); e.Code > 0 {
    32  		return e // actually a micro error
    33  	}
    34  
    35  	// fallback
    36  	return errors.InternalServerError("go.micro.client", s.Message())
    37  }