// array_prepend_zero_macro.nyash // MacroBoxSpec.expand: prepend 0 to every Array elements list in AST JSON v0 // Contract: expand(json: string) -> string (AST JSON v0) static box MacroBoxSpec { expand(json) { local s, out, i, pat, plen, ins s = json out = "" i = 0 pat = "\"kind\":\"Array\",\"elements\":[" plen = pat.length() ins = "{\"kind\":\"Literal\",\"value\":{\"type\":\"int\",\"value\":0}}" loop(i < s.length()) { if i + plen <= s.length() && s.substring(i, i + plen) == pat { // Copy the Array header out = out + pat // Look ahead: if next is ']' it's empty array; otherwise add comma after inserted element if i + plen < s.length() && s.substring(i + plen, i + plen + 1) != "]" { out = out + ins + "," } else { out = out + ins } i = i + plen continue } // Also support reversed key order: ..."elements":[ ... ],"kind":"Array" if i + 12 <= s.length() && s.substring(i, i + 12) == "\"elements\":[" { // We will inject blindly here assuming this 'elements' belongs to Array (per schema it does) out = out + "\"elements\":[" if i + 12 < s.length() && s.substring(i + 12, i + 13) != "]" { out = out + ins + "," } else { out = out + ins } i = i + 12 continue } // Copy-through out = out + s.substring(i, i + 1) i = i + 1 } return out } }