vertigo-cli 0.2.0-alpha

Reactive Real-DOM library for Rust - packaging tool
Documentation
use cargo::core::compiler::{CompileTarget, CompileKind, MessageFormat};
use cargo::{ops, Config};
use cargo::util::command_prelude::CompileMode;
use std::path::PathBuf;

use super::cargo_workspace::get_workspace;

const TARGET: &str = "wasm32-unknown-unknown";
const MODE: &str = "release";

pub fn run_cargo_build(package_name: &str, public_path: &str) -> Result<PathBuf, String> {
    log::info!("Building {package_name}");

    std::env::set_var("VERTIGO_PUBLIC_PATH", public_path);

    let mut config_opt = Config::default();
    let workspace = match get_workspace(&mut config_opt) {
        Ok(ws) => ws,
        Err(err) => {
            let msg = format!("Build failed: {err}");
            log::error!("{}", &msg);
            return Err(msg);
        }
    };

    let mut options = ops::CompileOptions::new(workspace.config(), CompileMode::Build).unwrap();
    options.spec = ops::Packages::from_flags(false, vec![], vec![package_name.to_string()]).unwrap();
    let target = CompileTarget::new(TARGET).unwrap();
    options.build_config.requested_kinds = vec![CompileKind::Target(target)];
    options.build_config.requested_profile = MODE.into();
    options.build_config.message_format = MessageFormat::Human;
    options.build_config.keep_going = true;

    match ops::compile(&workspace, &options) {
        Ok(_success) => {
            log::info!("WASM built successfully");
            Ok(workspace.target_dir().join(TARGET).join(MODE).into_path_unlocked())
        },
        Err(err) => {
            log::error!("WASM build failed: {err}");
            Err(err.to_string())
        }
    }
}