bandsocks 0.2.1

Experimental embeddable container sandbox
use build_deps::rerun_if_changed_paths;
use fs_extra::{copy_items, dir::CopyOptions};
use std::{
    env::var,
    fs::{copy, create_dir_all},
    path::Path,
    process::Command,
};

fn main() {
    // skip building sand when running in rust-language-server
    if var("RUSTC_WORKSPACE_WRAPPER").is_ok() {
        return;
    }

    let cargo = var("CARGO").unwrap();
    let out_dir = var("OUT_DIR").unwrap();
    let build_dir = Path::new(&out_dir).join("sand");
    create_dir_all(&build_dir).unwrap();

    rerun_if_changed_paths("sand/sand-Cargo.toml").unwrap();
    rerun_if_changed_paths("sand/sand-Cargo.lock").unwrap();
    rerun_if_changed_paths("sand/src/**/*.rs").unwrap();

    let mut opts = CopyOptions::new();
    opts.copy_inside = true;
    opts.skip_exist = true;
    copy("sand/sand-Cargo.toml", build_dir.join("Cargo.toml")).unwrap();
    copy("sand/sand-Cargo.lock", build_dir.join("Cargo.lock")).unwrap();
    copy_items(&["sand/src"], &build_dir, &opts).unwrap();

    let args = &["build", "--release"];

    // prefer to run rustup's cargo wrapper and explicitly ask for nightly.
    // sand needs nightly rust but we'd like to not require it for the outer app.
    let result = Command::new("cargo")
        .current_dir(&build_dir)
        .arg("+nightly")
        .args(args)
        .status();
    if result.is_ok() {
        assert!(result.unwrap().success());
        return;
    }

    assert!(Command::new(cargo)
        .current_dir(&build_dir)
        .args(args)
        .status()
        .unwrap()
        .success());
}