code: func FromGRPC(err error, args ...interface{}) error {
  	if err == nil {
  		return nil
  	}
  	code := grpc.Code(err)
  	message := grpc.ErrorDesc(err)
  	var e error
  	switch code {
  	case codes.OK:
  		return nil
  	case codes.NotFound:
  		e = &trace.NotFoundError{Message: message}
  	case codes.AlreadyExists:
  		e = &trace.AlreadyExistsError{Message: message}
  	case codes.PermissionDenied:
  		e = &trace.AccessDeniedError{Message: message}
  	case codes.FailedPrecondition:
  		e = &trace.CompareFailedError{Message: message}
  	case codes.InvalidArgument:
  		e = &trace.BadParameterError{Message: message}
  	case codes.ResourceExhausted:
  		e = &trace.LimitExceededError{Message: message}
  	case codes.Unavailable:
  		e = &trace.ConnectionProblemError{Message: message}
  	case codes.Unimplemented:
  		e = &trace.NotImplementedError{Message: message}
  	default:
  		e = errors.New(message)
  	}
  	if len(args) != 0 {
  		if meta, ok := args[0].(metadata.MD); ok {
  			e = DecodeDebugInfo(e, meta)
  		}
  	}
  	return e
  }
docs: // FromGRPC converts error from GRPC error back to trace.Error
  // Debug information will be retrieved from the metadata if specified in args