import { JSON } from "../../.."; import { BRACKET_LEFT, BRACKET_RIGHT, COMMA } from "../../../custom/chars"; import { deserializeFloatArrayBody } from "./float"; import { ensureArrayField, scanValueEnd, skipWhitespace } from "./shared"; export function deserializeArrayArrayBody( 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) { if (isFloat>>()) { let value: valueof; if (index < out.length) { value = unchecked(out[index]); } else { value = changetype>(instantiate>()); out.push(value); } srcStart = deserializeFloatArrayBody>( srcStart, srcEnd, value, ); if (!srcStart || srcStart >= srcEnd) break; } else if (isArray>>()) { let value: valueof; if (index < out.length) { value = unchecked(out[index]); } else { value = changetype>(instantiate>()); out.push(value); } srcStart = deserializeArrayArrayBody>( srcStart, srcEnd, value, ); if (!srcStart || srcStart >= srcEnd) break; } else { const valueEnd = scanValueEnd(srcStart, srcEnd); if (!valueEnd || valueEnd <= srcStart) break; let valuePtr: usize = 0; if (index < out.length) { valuePtr = changetype(unchecked(out[index])); } const value = JSON.__deserialize>( srcStart, valueEnd, valuePtr, ); if (index < out.length) unchecked((out[index] = value)); else out.push(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) { // Skip the runtime `ensureCapacity` call when the length is already // correct (the array is being reused with the same shape, e.g. // canada's geometry rings across repeated parses). 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 deserializeArrayArrayField( srcStart: usize, srcEnd: usize, fieldPtr: usize, ): usize { return deserializeArrayArrayBody( srcStart, srcEnd, ensureArrayField(fieldPtr), ); }