1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use anyhow::{Context, Error};
use std::path::{Path, PathBuf};

use cargo_wasmer::Pack;
use wasmer_pack_cli::{Codegen, Language};

pub fn compile_rust_to_wapm_package(
    manifest_path: &Path,
    out_dir: impl Into<PathBuf>,
) -> Result<PathBuf, Error> {
    let mut pack = Pack::default();
    pack.manifest.manifest_path = Some(manifest_path.to_path_buf());
    pack.out_dir = Some(out_dir.into());
    pack.debug = true;

    let meta = pack
        .metadata()
        .context("Unable to determine the package metadata")?;

    let packages = pack.resolve_packages(&meta);
    anyhow::ensure!(packages.len() == 1);

    let generated_package_dir =
        pack.generate_wasmer_package(packages[0], meta.target_directory.as_ref())?;

    Ok(generated_package_dir)
}

pub fn generate_bindings(
    dest: &Path,
    wapm_dir: &Path,
    lang: Language,
    name: Option<String>,
) -> Result<(), anyhow::Error> {
    tracing::info!(
        output_dir=%dest.display(),
        wapm_dir=%wapm_dir.display(),
        language=?lang,
        "Generating bindings",
    );
    let codegen = Codegen {
        name,
        out_dir: Some(dest.to_path_buf()),
        input: wapm_dir.to_path_buf(),
    };
    codegen.run(lang)?;
    Ok(())
}