variadic - The `wasm-bindgen` Guide

# Variadic Parameters

In javascript, both the types of function arguments, and the number of function arguments are dynamic. For example

    function sum(...rest) {
        let i;
        // the old way
        let old_way = 0;
        for (i=0; i<arguments.length; i++) {
            old_way += arguments[i];
        }
        // the new way
        let new_way = 0;
        for (i=0; i<rest.length; i++) {
            new_way += rest[i];
        }
        // both give the same answer
        assert(old_way === new_way);
        return new_way;
    }

This function doesn't translate directly into rust, since we don't currently support variadic arguments on the Wasm target. To bind to it, we use a slice as the last argument, and annotate the function as variadic:

    #![allow(unused)]
    fn main() {
    #[wasm_bindgen]
    extern "C" {
        #[wasm_bindgen(variadic)]
        fn sum(args: &[i32]) -> i32;
    }
    }

when we call this function, the last argument will be expanded as the javascript expects.

To export a rust function to javascript with a variadic argument, we will use the same bindgen variadic attribute and assume that the last argument will be the variadic array. For example the following rust function:

    #![allow(unused)]
    fn main() {
    #[wasm_bindgen(variadic)]
    pub  fn  variadic_function(arr: &JsValue) -> JsValue {
    	arr.into()
    }
    }

will generate the following TS interface

    export  function  variadic_function(...arr:  any):  any;