1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
use std::{ env, fs, io::{self, Read as _, Write as _}, path::{Path, PathBuf}, }; use crate::{Generator, Language}; pub enum Output { Stdout, Directory(PathBuf), } pub struct Compiler { language: Option<Language>, file_path: Option<PathBuf>, output: Output, } impl Default for Compiler { fn default() -> Self { Compiler::new() } } impl Compiler { pub fn new() -> Self { Self { language: None, file_path: None, output: Output::Stdout, } } pub fn language(&mut self, lang: Language) -> &mut Self { self.language.replace(lang); self } pub fn file_path<P>(&mut self, path: P) -> &mut Self where P: AsRef<Path>, { self.file_path.replace(path.as_ref().to_path_buf()); self } pub fn default_out_dir(&mut self) -> &mut Self { let out_dir = PathBuf::from(&env::var("OUT_DIR").unwrap_or_else(|_| ".".to_string())); self.output = Output::Directory(out_dir); self } pub fn out_dir<P>(&mut self, path: P) -> &mut Self where P: AsRef<Path>, { self.output = Output::Directory(path.as_ref().to_path_buf()); self } pub fn run(&mut self) { let lang = self.language.unwrap(); let mut file_in = fs::OpenOptions::new() .read(true) .open(&self.file_path.as_ref().unwrap()) .unwrap(); let mut buffer = String::new(); file_in.read_to_string(&mut buffer).unwrap(); let generator = Generator::new(&buffer); match self.output { Output::Directory(ref out_dir) => { let file_name = self .file_path .as_ref() .unwrap() .file_name() .unwrap() .to_owned(); let mut out_file = out_dir.to_owned(); out_file.push(file_name); out_file.set_extension(lang.extension()); let mut file_out = fs::OpenOptions::new() .create(true) .write(true) .truncate(true) .open(&out_file) .unwrap(); generator.generate(lang, &mut file_out).unwrap(); file_out.flush().unwrap(); } Output::Stdout => { let stdout = io::stdout(); let mut stdout_handle = stdout.lock(); generator.generate(lang, &mut stdout_handle).unwrap(); stdout_handle.flush().unwrap(); } } } }