JSON decoding with field-level errors in Nim

Nim
import std/json

proc parseUser(body: string): tuple[name: string, age: int] =
  var node: JsonNode
  try:
    node = parseJson(body)
  except JsonParsingError as e:
    raise newException(ValueError, "invalid JSON: " & e.msg)
  if node.kind != JObject:
    raise newException(ValueError, "expected object, got " & $node.kind)
  for field in ["name", "age"]:
    if not node.hasKey(field):
      raise newException(ValueError, "missing field: " & field)
  if node["name"].kind != JString or node["age"].kind != JInt:
    raise newException(ValueError, "wrong field type")
  (name: node["name"].getStr, age: node["age"].getInt)

echo parseUser("""{"name": "ada", "age": 36}""")