1#![warn(clippy::all)]
2
3pub mod data;
4mod pipeline;
5
6mod parser;
7
8#[cfg(test)]
9mod tests;
10
11#[cfg(test)]
12mod test_utils;
13
14pub use data::*;
15
16use pipeline::prelude::*;
17
18pub fn generate(src: &str) -> Result<RustSrc, KikiErr> {
19 let tokens = tokenize(src)?;
20 let cst = parse(tokens)
21 .map_err(|unexpected| unexpected_token_or_eof_to_kiki_err(unexpected.as_ref(), src))?;
22 let ast: data::ast::File = cst.into();
23 let validated = validate_ast(ast)?;
24 let machine = validated_ast_to_machine(&validated);
25 let table = machine_to_table(&machine, &validated)?;
26 Ok(table_to_rust(&table, &validated, src))
27}
28
29pub fn get_grammar_hash(src: RustSrcRef) -> Option<&str> {
30 const HASH_PREFIX: &str = "// @sha256 ";
31 for line in src.0.lines() {
32 if !line.starts_with("//") {
33 return None;
34 }
35
36 if line.starts_with(HASH_PREFIX) {
37 let hash = line.trim_start_matches(HASH_PREFIX);
38 return Some(hash);
39 }
40 }
41 None
42}