if (process.argv.length < 3) {
    console.error('Invalid number of arguments');
    process.exit(1);
}

const program = process.argv[2];
const args = process.argv.slice(3);

const wasm = await import('./target/wasm32-unknown-emscripten/release/wasm.js');
const module = {
    print: (str) => console.log(str),
    printErr: (str) => console.error(str),
}

const Module = await wasm.default(module);

// allocate strings to be able to pass them
const arg_pointers = args.map(a => {
    const arg_pointer = Module._malloc(a.length + 1); // +1 for \0
    Module.stringToUTF8(a, arg_pointer, a.length + 1);
    return arg_pointer;
})
const args_pointer = Module._malloc(args.length * 4); // 4 bytes for each pointer
arg_pointers.forEach((pointer, i) => {
    Module.setValue(args_pointer + i * 4, pointer, 'i32')
});

Module.ccall('execute', null, ['string', 'number', 'array'], [program, args.length, arg_pointers])

// free allocated strings
arg_pointers.forEach(pointer => Module._free(pointer))
Module._free(arg_pointers)