sam 0.3.1

A compile time instruction assembler.
use std::process::Command;
use std::env;

#[cfg(not(target_os = "windows"))]
const GIT: &str = "https://github.com/keystone-engine/keystone.git";
#[cfg(target_os = "windows")]
const ZIP: &str = "https://github.com/keystone-engine/keystone/releases/download/0.9.1/keystone-0.9.1-win64.zip";

fn check_cmd(cmd: &str) -> bool {
    match Command::new(cmd).spawn() {
        Ok(_) => true,
        Err(_) => false, 
    }
}

fn check_sudo() {
    let is_sudo = match env::var("USER") {
        Ok(val) => val == "root",
        Err(_) => false,
    };
    if !is_sudo { panic!("You have to run this as root!"); }
}

#[cfg(target_os = "macos")]
fn check_dependencies() {
    if !check_cmd("brew") { panic!("Homebrew not found!"); }
    if !check_cmd("cmake") { 
        Command::new("brew")
            .args(&["install", "cmake"])
            .output()
            .expect("failed to execute process");
    }
    if !check_cmd("git") { 
        Command::new("brew")
            .args(&["install", "git"])
            .output()
            .expect("failed to execute process");
    }
}

#[cfg(target_os = "linux")]
fn check_dependencies() {
    if !check_cmd("cmake") { 
        Command::new("apt-get")
            .args(&["install", "cmake"])
            .output()
            .expect("failed to execute process");
    }
    if !check_cmd("git") { 
        Command::new("apt-get")
            .args(&["install", "git"])
            .output()
            .expect("failed to execute process");
    }
}

#[cfg(target_os = "windows")]
fn download_kstool() {
    let mut output = Command::new("powershell")
            .args(&["-Command", &format!("Invoke-WebRequest {} -OutFile keystone.zip", ZIP)])
            .output()
            .expect("failed to execute process");
    println!("{:?}", String::from_utf8_lossy(&output.stdout));
    output = Command::new("powershell")
            .args(&["-Command", "Expand-Archive -Path keystone.zip -DestinationPath ."])
            .output()
            .expect("failed to execute process");
    println!("{:?}", String::from_utf8_lossy(&output.stdout));
    let path = env::home_dir().unwrap();
    let cargo_bin = &format!("{}\\.cargo\\bin\\", path.display()); // just install it to .cargo/bin for now.
    output = Command::new("powershell")
            .args(&["xcopy", ".\\keystone-0.9.1-win64\\kstool.exe", cargo_bin])
            .output()
            .expect("failed to execute process");
    println!("{:?}", String::from_utf8_lossy(&output.stdout));
    output = Command::new("powershell")
            .args(&["rm", "-r", ".\\keystone-0.9.1-win64\\"])
            .output()
            .expect("failed to execute process");
    println!("{:?}", String::from_utf8_lossy(&output.stdout));
    output = Command::new("powershell")
            .args(&["rm", ".\\keystone.zip"])
            .output()
            .expect("failed to execute process");
    println!("{:?}", String::from_utf8_lossy(&output.stdout));
}

#[cfg(not(target_os = "windows"))]
fn download_kstool() {
    let mut output = Command::new("git")
            .args(&["clone", GIT])
            .output()
            .expect("failed to execute process");
    println!("{:?}", String::from_utf8_lossy(&output.stdout));
    output = Command::new("mkdir")
            .current_dir("keystone/")
            .args(&["build"])
            .output()
            .expect("failed to execute process");
    println!("{:?}", String::from_utf8_lossy(&output.stdout));
    output = Command::new("sh")
            .current_dir("keystone/build/")
            .args(&["../make-share.sh"])
            .output()
            .expect("failed to execute process");
    println!("{:?}", String::from_utf8_lossy(&output.stdout));
    output = Command::new("make")
            .current_dir("keystone/build/")
            .args(&["install"])
            .output()
            .expect("failed to execute process");
    println!("{:?}", String::from_utf8_lossy(&output.stdout));
    output = Command::new("rm")
            .args(&["-r", "-f", "keystone"])
            .output()
            .expect("failed to execute process");
    println!("{:?}", String::from_utf8_lossy(&output.stdout));
}

fn main() {
    if !check_cmd("kstool") {
        if cfg!(target_os = "linux") { check_sudo(); }
        if cfg!(target_os = "macos") || cfg!(target_os = "linux") { check_dependencies(); }
        download_kstool();
    }
}