macro_rules! visit_base { ($length:literal, $($contents:expr)*) => { fn list_assets() -> String { let root_depth = 0; [$($contents(root_depth),)*].join("") } }; } macro_rules! visit_folder { ($name:literal, $id:ident, $($contents:expr)*) => {{ fn list_folder(depth: usize) -> String { let name = $name; [ indent_line(depth, &format!("{name}/")), $($contents(depth + 1),)* ] .join("") } list_folder }}; } fn indent_line(depth: usize, contents: &str) -> String { let indentation = " ".repeat(depth); format!("{indentation}{contents}\n") } macro_rules! visit_file { ($name:literal, $id:ident, $index:literal, $relative_path:literal, $absolute_path:literal) => {{ fn list_file(depth: usize) -> String { indent_line(depth, $name) } list_file }}; } #[iftree::include_file_tree( " paths = '/examples/assets/**' [[template]] visit_base = 'visit_base' visit_folder = 'visit_folder' visit_file = 'visit_file' " )] pub struct Asset; fn main() { assert_eq!( list_assets(), "examples/ assets/ .env configuration/ menu.json translations.csv credits.md world/ levels/ tutorial.json physical_constants.json ", ); }