1#![doc = include_str!("../README.md")]
2#![allow(clippy::needless_doctest_main)]
3
4pub mod gen;
5mod utils;
6
7use fluid_parser::lexer::Lexer;
8use fluid_parser::parser::Parser;
9use std::error;
10use std::fs;
11use std::path::*;
12
13#[derive(Default)]
15pub struct Generator {}
16
17impl Generator {
18 pub fn in_out<P: AsRef<Path>>(
20 &self,
21 inpath: P,
22 outpath: P,
23 ) -> Result<(), Box<dyn error::Error>> {
24 let content = fs::read_to_string(&inpath)?;
25 let lexer = Lexer::new(&content);
26 let mut parser = Parser::new(lexer);
27 let old_cwd = std::env::current_dir().unwrap();
28 let _ = std::env::set_current_dir(inpath.as_ref().parent().unwrap()).unwrap();
29 let out = gen::generate(&parser.parse());
30 let _ = std::env::set_current_dir(old_cwd);
31 fs::write(outpath, out)?;
32 Ok(())
33 }
34
35 pub fn in_out_with_directives_preamble<P: AsRef<Path>>(
37 &self,
38 inpath: P,
39 outpath: P,
40 ) -> Result<(), Box<dyn error::Error>> {
41 let content = fs::read_to_string(&inpath)?;
42 let lexer = Lexer::new(&content);
43 let mut parser = Parser::new(lexer);
44 let old_cwd = std::env::current_dir().unwrap();
45 let _ = std::env::set_current_dir(inpath.as_ref().parent().unwrap()).unwrap();
46 let out = gen::generate_with_directives_preamble(&parser.parse());
47 let _ = std::env::set_current_dir(old_cwd);
48 fs::write(
49 outpath,
50 out,
51 )?;
52 Ok(())
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 #[test]
59 fn it_works() {
60 use super::*;
61 let g = Generator::default();
62 g.in_out("fl_tests/fl.fl", "fl_tests/fl.rs")
63 .expect("Failed to generate rust from fl file!");
64 g.in_out("fl_tests/fl2.fl", "fl_tests/fl2.rs")
65 .expect("Failed to generate rust from fl file!");
66 g.in_out("fl_tests/unt.fl", "fl_tests/unt.rs")
67 .expect("Failed to generate rust from fl file!");
68 }
69}