use lazy_regex::regex_captures;
use std::env;
use std::fs;
use std::io;
use std::io::BufRead;
use std::io::Write;
use std::path::Path;
fn main() {
let out_dir = env::var_os("OUT_DIR").unwrap();
let reader = io::BufReader::new(fs::File::open("misc/sddl.h").unwrap());
let mut out_file = io::BufWriter::new(
fs::File::create(Path::new(&out_dir).join("sddl_h.rs")).unwrap(),
);
writeln!(out_file, "#[allow(unused,non_upper_case_globals)]").unwrap();
writeln!(out_file, "pub (crate) mod sddl_constants {{").unwrap();
for line in reader.lines() {
let line = line.unwrap();
if let Some((_, id, value, comment)) = regex_captures!(
r#"#define\s+(SDDL_[a-zA-Z0-9_]+)\s+TEXT\('([^']+)'\)(?:\s+//\s*(.+)?)?"#,
&line
) {
if !comment.is_empty() {
writeln!(out_file, "/// {comment}").unwrap();
}
writeln!(out_file, "pub const {id}: char = \'{value}\';").unwrap();
} else if let Some((_, id, value, comment)) = regex_captures!(
r#"#define\s+(SDDL_[a-zA-Z0-9_]+)\s+TEXT\("([^"]+)"\)(?:\s+//\s*(.+)?)?"#,
&line
) {
if !comment.is_empty() {
writeln!(out_file, "/// {comment}").unwrap();
}
writeln!(out_file, "pub const {id}: &str = \"{value}\";").unwrap();
}
}
writeln!(out_file, "}}").unwrap();
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=misc/sddl.h");
println!("cargo:rerun-if-changed=src/parser.lalrpop");
lalrpop::process_root().unwrap();
}