UNPKG

@thi.ng/wasm-api-bindgen

Version:

Polyglot bindings code generators (TS/JS, Zig, C11) for hybrid WebAssembly projects

71 lines (70 loc) 2.09 kB
import { illegalArgs } from "@thi.ng/errors/illegal-arguments"; import { isEnum, isOpaque, isPadding, isPointer, isSlice, isWasmPrim, isWasmString } from "./utils.js"; const classifyField = (field, coll) => { if (isPadding(field)) return { classifier: "pad", isConst: false }; const $isPrim = isWasmPrim(field.type); const $isStr = isWasmString(field.type); const $isSlice = isSlice(field.tag); const $isPtr = isPointer(field.tag); const $isEnum = isEnum(field.type, coll); const $isArray = field.tag === "array"; const $isVec = field.tag === "vec"; if ($isVec && !$isPrim) { illegalArgs("only vectors of numeric types allowed"); } if (field.sentinel != null && !$isPrim) { illegalArgs("sentinels only supported for numeric types"); } let id = "single"; let $const = !!field.const; if ($isStr) { $const = field.const !== false; id = __classifyType("str", $isArray, $isSlice, $isPtr, field.len); } else if (isOpaque(field.type)) { id = __classifyType("opaque", $isArray, $isSlice, $isPtr, field.len); } else if ($isEnum) { id = __classifyType("enum", $isArray, $isSlice, $isPtr, field.len); } else { if ($isArray || $isVec) { __ensureLength(field.len); id = $isArray ? "array" : "vec"; } else if ($isSlice) { id = "slice"; } else if ($isPtr) { id = __selectForLength(field.len, "ptr", "ptrFixed", "ptrMulti"); } } return { classifier: id, isConst: $const }; }; const __classifyType = (base, $isArray, $isSlice, $isPtr, len) => { if ($isArray) { __ensureLength(len); return base + "Array"; } else if ($isSlice) { return base + "Slice"; } else if ($isPtr) { return __selectForLength( len, base + "Ptr", base + "PtrFixed", base + "PtrMulti" ); } return base; }; const __selectForLength = (len, single, fixed, multi) => len != null ? len > 0 ? fixed : multi : single; const __ensureLength = (len) => { if (len == null || len < 1) illegalArgs("missing or invalid array/vec length"); }; export { classifyField };