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