import { JSON } from "../../.."; import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../../custom/chars"; import { ensureArrayElementSlot, ensureArrayField, scanValueEnd, skipWhitespace, } from "./shared"; export function deserializeGenericArrayBody( srcStart: usize, srcEnd: usize, out: T, ): usize { if (srcStart >= srcEnd || load(srcStart) != BRACKET_LEFT) throw new Error("Failed to parse JSON!"); srcStart += 2; srcStart = skipWhitespace(srcStart, srcEnd); if (srcStart >= srcEnd) throw new Error("Failed to parse JSON!"); if (load(srcStart) == BRACKET_RIGHT) return srcStart + 2; let index = 0; while (srcStart < srcEnd) { const valueEnd = scanValueEnd(srcStart, srcEnd); if (!valueEnd || valueEnd <= srcStart) break; const slot = ensureArrayElementSlot(out, index++); store>(slot, JSON.__deserialize>(srcStart, valueEnd)); srcStart = valueEnd; srcStart = skipWhitespace(srcStart, srcEnd); if (srcStart >= srcEnd) break; const code = load(srcStart); if (code == COMMA) { srcStart += 2; srcStart = skipWhitespace(srcStart, srcEnd); continue; } if (code == BRACKET_RIGHT) { out.length = index; return srcStart + 2; } break; } throw new Error("Failed to parse JSON!"); } export function deserializeGenericArrayField( srcStart: usize, srcEnd: usize, fieldPtr: usize, ): usize { return deserializeGenericArrayBody( srcStart, srcEnd, ensureArrayField(fieldPtr), ); }