status-im / nim-graphql

Nim implementation of GraphQL with sugar and steroids
Apache License 2.0
65 stars 6 forks source link

Custom error messages #103

Open flintforge opened 2 years ago

flintforge commented 2 years ago

Errors raised in a resolver — let's take

ErrValueError:  "Field '$1' cannot be resolved: \"$2\"" % [msg[0], msg[1]]

get they type after a RespResult holding a message string and the place where they're occur. Comparing the situation to other GraphQL implementations, I'm wondering if there's a way to provide custom error messages ? Perhaps raising an other exception when an unspecified error kind is met, and adding a custom one with no formatting along the lines ? https://github.com/status-im/nim-graphql/blob/4f98887894b53dc2247ca461a0f2771d1a23e7fb/graphql/graphql.nim#L260

Also, is it possible to stack them in a sequence before returning ? I tried with ctx.errors.add but this is a user context, not the calling one (if that makes sense, but I'm still building the mental picture of the mechanisms). If not I would gladly PR on that.

jangko commented 2 years ago

currently the resolver is using this return type:

RespResult* = Result[Node, string]

if you need custom error message, a possible alternative is using object variant to replace the string.

type
  RespErrorType* = enum
      SimpleMsg      # formatting handled by executor
      CustomMsg    # formatting done by user
      ListMsg           # return one or more error messages
      etc.

  RespError = object
     case typ*: RespErrorType
     of SimpleMsg:  msg*: string
     of CustomMsg: customMsg*: string
     of ListMsg: listMsg*: seq[string or errorobject]
     etc.

  RespResult* = Result[Node, RespError]

then you need to overload err to provide backward compatible helper proc. the rest is quite straight forward modification in executeField of executor.nim.

But if you have other solution, we can discuss it further.