use std::collections::HashMap;
use std::fs;
use std::io::Read;
use crate::Value;
use crate::TemplateManager;
use super::parse;
use super::compile;
#[macro_export]
macro_rules! insert_entry {
($map:expr, $key:ident = $value:literal) => {
$map.insert(stringify!($key).to_string(), object!($value));
};
($map:expr, $key:ident = $value:expr) => {
$map.insert(stringify!($key).to_string(), $value);
};
}
#[macro_export]
macro_rules! parse_file {
($path:expr, $($key:ident = $value:tt),* $(,)?) => {{
let bytes = std::fs::read($path)
.expect(&format!("Failed to read file: {}", $path));
let mut map = std::collections::HashMap::new();
$(
insert_entry!(map, $key = $value);
)*
render_bytes(&bytes, &mut map)
}};
}
#[macro_export]
macro_rules! parse_bytes {
($bytes:expr, $($key:ident = $value:tt),* $(,)?) => {{
let mut map = std::collections::HashMap::new();
$(
insert_entry!(map, $key = $value);
)*
render_bytes($bytes, &mut map)
}};
}
#[macro_export]
macro_rules! parse_string {
($s:expr, $($key:ident = $value:tt),* $(,)?) => {{
let bytes = $s.to_string().into_bytes();
let mut map = std::collections::HashMap::new();
$(
insert_entry!(map, $key = $value);
)*
render_bytes(&bytes, &mut map)
}};
}
#[cfg(test)]
mod tests {
use super::*;
use crate::object;
#[test]
fn test_tokenize() {
let input = r#"
-[ template "template.html" ]-
-[ block header ]-
<script src="pmine.org"></script>
-[ endblock ]-
-[ block body ]-
-[ let a = 1 ]-
-[ for str in list ]-
-[ if (a % 2 == 0) ]-
-[ output str ]-
-[ endif ]-
-[ a = a + 1 ]-
-[ endfor ]-
-[ endblock ]-
"#;
let mut data = HashMap::new();
data.insert("list".to_string(), object!(vec![ object!("a"),
object!("b"),
object!("c")]));
}
}