kiki/
lib.rs

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}