41 lines
1.4 KiB
Rust
41 lines
1.4 KiB
Rust
use ast_generator::{deserialize, generate_files};
|
|
use cst_test_generator::generate_test_files;
|
|
use std::env;
|
|
use std::fs;
|
|
use std::io;
|
|
use std::path::Path;
|
|
|
|
fn generate_parser_tests(out_dir: &Path) -> io::Result<()> {
|
|
let parser_tests_dir = out_dir.join("src").join("parser").join("tests");
|
|
fs::create_dir_all(&parser_tests_dir)?;
|
|
let test_suites_file = generate_test_files(Path::new("src/parser/tests"))?;
|
|
let file_path = parser_tests_dir.join(&test_suites_file.file_name);
|
|
fs::write(file_path, &test_suites_file.contents)?;
|
|
Ok(())
|
|
}
|
|
|
|
fn generate_ast_files(out_dir: &Path) -> io::Result<()> {
|
|
let gen_ast_dir = out_dir.join("src").join("ast");
|
|
fs::create_dir_all(&gen_ast_dir)?;
|
|
|
|
let ast_yaml = include_str!("src/parser/ast.yaml");
|
|
let build_specs = deserialize::deserialize_yaml_spec(ast_yaml);
|
|
let generated_files = generate_files(&build_specs);
|
|
for generated_file in &generated_files {
|
|
let path = gen_ast_dir.join(&generated_file.name);
|
|
fs::write(path, &generated_file.contents)?;
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
fn main() -> io::Result<()> {
|
|
println!("cargo:rerun-if-changed=src/parser/tests");
|
|
println!("cargo:rerun-if-changed=src/parser/ast.yaml");
|
|
println!("cargo:rerun-if-changed=src/parser/deimos.pest");
|
|
let out_dir = env::var_os("OUT_DIR").unwrap();
|
|
let out_dir_path = Path::new(&out_dir);
|
|
generate_parser_tests(out_dir_path)?;
|
|
generate_ast_files(out_dir_path)?;
|
|
Ok(())
|
|
}
|