liboj 0.2.1

A high performance framework for building online judge system
use std::collections::HashMap;
use std::env;
use std::fs::read_dir;
use std::fs::read_to_string;
use std::fs::File;
use std::io::prelude::*;
use std::path::PathBuf;

use bindgen;
use lazy_static::lazy_static;
use serde_json;

lazy_static! {
    static ref OUT_DIR: PathBuf = {
        let out_dir = env::var("OUT_DIR").unwrap();
        PathBuf::from(out_dir)
    };
    static ref ROOT_DIR: PathBuf = {
        let root_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
        PathBuf::from(root_dir)
    };
}

fn main() {
    generate_compiler_backends();
    generate_seccomp_binding();
}

fn generate_seccomp_binding() {
    println!("cargo:rustc-link-lib=dylib=seccomp");
    bindgen::builder()
        .header_contents("seccomp_wrapper.h", "#include<seccomp.h>")
        .generate()
        .expect("Failed to generate seccomp bindings")
        .write_to_file(OUT_DIR.join("seccomp_wrapper.rs"))
        .expect("Failed to write to seccomp wrapper file");
}

fn generate_compiler_backends() {
    let backends_dir = ROOT_DIR.join("src/compiler/backends");
    let mut backends: HashMap<String, String> = HashMap::new();
    read_dir(&backends_dir)
        .unwrap()
        .map(|entry| entry.unwrap())
        .filter(|entry| entry.file_name().to_str().unwrap().ends_with(".json"))
        .map(|entry| (entry.file_name(), read_to_string(&entry.path()).unwrap()))
        .for_each(|(filename, config)| {
            let language = filename
                .to_str()
                .unwrap()
                .trim_end_matches(".json")
                .to_owned();
            backends.insert(language, config);
        });
    let backends_json = OUT_DIR.join("compiler_backends.json");
    let backends_file = File::create(backends_json).unwrap();
    serde_json::to_writer(backends_file, &backends).unwrap();
}