use std::{ env, fs, io::{self, Read, Write}, path::Path, process::{Child, Command, Stdio}, thread, }; use vector_math_build_helpers::make_context_types; fn format_source(source: String) -> String { let rustfmt_path = which::which("rustfmt").unwrap(); let mut command = Command::new(rustfmt_path) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .spawn() .unwrap(); let stdin = command.stdin.take().unwrap(); let reader_thread = thread::spawn(move || -> io::Result<(String, Child)> { let mut output = String::new(); command.stdout.take().unwrap().read_to_string(&mut output)?; Ok((output, command)) }); { stdin }.write_all(source.as_bytes()).unwrap(); let (output, mut command) = reader_thread.join().unwrap().unwrap(); let exit_status = command.wait().unwrap(); assert!(exit_status.success()); output } fn main() { fs::write( Path::new(&env::var_os("OUT_DIR").unwrap()).join("context_trait.rs"), format_source(make_context_types().to_string()), ) .unwrap(); }