# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. import os import subprocess from mach.decorators import Command, SubCommand # IMPORTANT: Please Request review from a DOM peer before # committing to using UniFFI. There are other ways to consume Rust from # JavaScript that might fit your use case better. UDL_FILES = [ "third_party/rust/tabs/src/tabs.udl", ] FIXTURE_UDL_FILES = [ "third_party/rust/uniffi-example-geometry/src/geometry.udl", "third_party/rust/uniffi-example-arithmetic/src/arithmetic.udl", "third_party/rust/uniffi-example-rondpoint/src/rondpoint.udl", "third_party/rust/uniffi-example-sprites/src/sprites.udl", "third_party/rust/uniffi-example-todolist/src/todolist.udl", "toolkit/components/uniffi-fixture-callbacks/src/callbacks.udl", "toolkit/components/uniffi-example-custom-types/src/custom-types.udl", "toolkit/components/uniffi-fixture-external-types/src/external-types.udl", ] CPP_PATH = "toolkit/components/uniffi-js/UniFFIGeneratedScaffolding.cpp" JS_DIR = "toolkit/components/uniffi-bindgen-gecko-js/components/generated" FIXTURE_CPP_PATH = "toolkit/components/uniffi-js/UniFFIFixtureScaffolding.cpp" FIXTURE_JS_DIR = "toolkit/components/uniffi-bindgen-gecko-js/fixtures/generated" def build_uniffi_bindgen_gecko_js(command_context): uniffi_root = crate_root(command_context) print("Building uniffi-bindgen-gecko-js") cmdline = [ "cargo", "build", "--release", "--manifest-path", os.path.join(command_context.topsrcdir, "Cargo.toml"), "--package", "uniffi-bindgen-gecko-js", ] subprocess.check_call(cmdline, cwd=uniffi_root) print() return os.path.join( command_context.topsrcdir, "target", "release", "uniffi-bindgen-gecko-js" ) @Command( "uniffi", category="devenv", description="Generate JS bindings using uniffi-bindgen-gecko-js", ) def uniffi(command_context, *runargs, **lintargs): """Run uniffi.""" command_context._sub_mach(["help", "uniffi"]) return 1 @SubCommand( "uniffi", "generate", description="Generate/regenerate bindings", ) def generate_command(command_context): binary_path = build_uniffi_bindgen_gecko_js(command_context) cmdline = [ binary_path, "--js-dir", JS_DIR, "--fixture-js-dir", FIXTURE_JS_DIR, "--cpp-path", CPP_PATH, "--fixture-cpp-path", FIXTURE_CPP_PATH, ] if UDL_FILES: cmdline += ["--udl-files"] + UDL_FILES if FIXTURE_UDL_FILES: cmdline += ["--fixture-udl-files"] + FIXTURE_UDL_FILES subprocess.check_call(cmdline, cwd=command_context.topsrcdir) return 0 def crate_root(command_context): return os.path.join( command_context.topsrcdir, "toolkit", "components", "uniffi-bindgen-gecko-js" )