erg_compiler 0.6.36

Centimetre: the Erg compiler
Documentation
#![allow(deprecated)]

use std::env;
use std::fs;
use std::path;

use erg_common::erg_util::env_erg_version;

fn main() -> std::io::Result<()> {
    let current_erg_version = env_erg_version();
    if current_erg_version.as_ref().map(|s| &s[..]) == Some(env!("CARGO_PKG_VERSION"))
        && env::var("ERG_PATH").is_ok()
        && !cfg!(feature = "debug")
    {
        return Ok(());
    }
    // Create a ".erg" directory
    let erg_path = env::home_dir()
        .expect("failed to get the location of the home dir")
        .to_str()
        .expect("invalid encoding of the home dir name")
        .to_string()
        + "/.erg";
    if !path::Path::new(&erg_path).exists() {
        fs::create_dir(&erg_path).unwrap_or_else(|_| {
            eprintln!("failed to create the directory: {erg_path}");
        });
    }
    println!("cargo:rustc-env=CARGO_ERG_PATH={erg_path}");
    // create a std library in ".erg"
    copy_dir(&erg_path, "lib").unwrap_or_else(|_| {
        eprintln!("failed to copy the std library to {erg_path}");
    });
    let pkgs_path = path::Path::new(&erg_path).join("lib").join("pkgs");
    if !pkgs_path.exists() {
        fs::create_dir(&pkgs_path).unwrap_or_else(|_| {
            eprintln!("failed to create the directory: {}", pkgs_path.display());
        });
    }
    Ok(())
}

fn copy_dir(erg_path: &str, path: &str) -> std::io::Result<()> {
    let full_path = format!("{erg_path}/{path}");
    if !path::Path::new(&full_path).exists() {
        fs::create_dir(&full_path)?;
    }
    let mut dirs = vec![];
    for res in fs::read_dir(path)? {
        let entry = res?;
        let entry_path = entry.path();
        if entry_path.is_dir() {
            dirs.push(entry);
        } else {
            let filename = entry_path
                .file_name()
                .expect("this is not a file")
                .to_string_lossy();
            let filename = format!("{full_path}/{filename}");
            fs::copy(&entry_path, filename)?;
        }
    }
    for dir in dirs {
        copy_dir(erg_path, dir.path().to_str().unwrap())?;
    }
    Ok(())
}