Deep clone and recursive merge for Nim JsonNode

Nim
import std/json

proc mergeInto(dst: var JsonNode; src: JsonNode) =
  if dst.kind != JObject or src.kind != JObject:
    dst = src.copy()
    return
  for key, val in src:
    if dst.hasKey(key):
      mergeInto(dst[key], val)
    else:
      dst[key] = val.copy()

var base = parseJson("""{"a": 1, "nested": {"x": 1, "y": 2}}""")
let patch = parseJson("""{"nested": {"y": 20, "z": 30}, "b": 2}""")
mergeInto(base, patch)
echo base