novax 0.0.1

NovaX is your go-to toolkit for building robust software seamlessly interacting with the MultiversX blockchain.
Documentation
use std::fs;
use std::path::Path;
use novax_abi_build::abi::parser::parse_abi_file;
use novax_abi_build::generator::impl_abi_mod::generate_from_abi;

const NON_GENERATED_CONTENT: [&str; 2] = [
    "lib.rs",
    "utils"
];

const NOVAX_PATH_ENV_NAME: &str = "NOVAX_PATH";
const NOVAX_RERUN_ENV_NAME: &str = "NOVAX_RERUN_BUILD_SCRIPT";

fn main() {
    let cargo_manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
    let out_dir_env = std::env::var("OUT_DIR").unwrap();
    let out_dir = Path::new(&out_dir_env).to_path_buf();
    let out_dir_content = fs::read_dir(&out_dir).unwrap();

    for content in out_dir_content.filter_map(|e| e.ok()) {
        if NON_GENERATED_CONTENT.contains(&content.file_name().to_str().unwrap()) {
            continue
        }

        if let Ok(content_type) = content.file_type() {
            if content_type.is_dir() {
                let _ = fs::remove_dir_all(content.path());
            } else if content_type.is_file() {
                let _ = fs::remove_file(content.path());
            }
        }
    }

    let codegen_path_result = std::env::var(NOVAX_PATH_ENV_NAME);
    let is_docs_rs = std::env::var("DOCS_RS").unwrap_or("0".to_string()) == "1";

    let mut lib_file_content = String::from("");

    if let Ok(codegen_path) = &codegen_path_result {
        if !is_docs_rs {
            let abis_path = Path::new(&cargo_manifest_dir).join(codegen_path).join("abis");
            let files_in_abis_path = fs::read_dir(&abis_path).unwrap();
            for file_result in files_in_abis_path {
                let Ok(file) = file_result else { continue };
                let Ok(file_type) = file.file_type() else { continue };
                let Ok(file_name) = file.file_name().into_string() else { continue };

                if file_type.is_file() && file_name.ends_with(".abi.json") {
                    let abi_path = abis_path.join(file_name);
                    let abi = parse_abi_file(&abi_path).unwrap();
                    let abi_generated_file = generate_from_abi(&abi).unwrap();

                    lib_file_content += &format!("#[allow(missing_docs)]\npub mod {};\n", abi_generated_file.mod_name);

                    fs::write(
                        out_dir.join(abi_generated_file.file_name),
                        abi_generated_file.file_content
                    ).unwrap();
                }
            }
        }
    }

    let lib_path = out_dir.join("generated_lib.rs");

    fs::write(
        lib_path,
        lib_file_content
    ).unwrap();

    println!("cargo:rerun-if-changed=build.rs");
    if let Ok(codegen_path) = codegen_path_result {
        println!("cargo:rerun-if-changed={codegen_path}");
    }
    println!("cargo:rerun-if-env-changed={NOVAX_PATH_ENV_NAME}");
    println!("cargo:rerun-if-env-changed={NOVAX_RERUN_ENV_NAME}");
}