use crate::utils::ProgramRepository;
use alloc::{format, vec::Vec};
use ellie_core::{error::Error, utils::PageExport};
use ellie_tokenizer::tokenizer::{Page, Pager};
pub fn tokenize_file(
program_repository: &mut dyn ProgramRepository,
) -> Result<PageExport<Page>, Vec<Error>> {
let main_program = program_repository.read_main();
let mut pager = Pager::new(
main_program.file_content,
main_program.file_name,
format!("{}/", main_program.start_directory),
move |link_module, path, module_identifier| {
program_repository.read_module(link_module, path.clone(), module_identifier)
},
main_program.file_hash,
);
match pager.run() {
Ok(_) => Ok(pager.pages),
Err(errors) => Err(errors),
}
}
#[macro_export]
macro_rules! tokenizeText {
($text:expr) => {{
use ellie_engine::{
ellie_core::defs,
ellie_tokenizer::tokenizer::{Pager, ResolvedImport},
utils::{MainProgram, ProgramRepository},
};
#[derive(Clone)]
struct Repository {
target_path: String,
}
let mut program_repository = Repository {
target_path: String::from("./main.ei"),
};
impl ProgramRepository for Repository {
fn read_main(&mut self) -> MainProgram {
let text = $text;
MainProgram {
file_content: text.to_string(),
file_name: "main.ei".to_string(),
file_hash: 0,
start_directory: format!("<ellie_module_main>"),
}
}
fn read_module(
&mut self,
link_module: bool,
current_path: String,
requested_path: String,
) -> ResolvedImport {
ResolvedImport {
found: false,
resolve_error: "Module resolver is not implemented on macros".to_owned(),
..Default::default()
}
}
}
let main_program = program_repository.read_main();
let mut pager = Pager::new(
main_program.file_content,
main_program.file_name,
format!("{}/", main_program.start_directory),
move |link_module, path, module_identifier| {
program_repository.read_module(link_module, path.clone(), module_identifier)
},
main_program.file_hash,
);
pager.run()
}};
}