@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
JavaScript
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
};