use eventb_lsp::server::operator_rows;
const NOTICE: &str =
"Generated by `rossi gen-grammars` from the canonical operator table. Do not edit by hand.";
pub fn render() -> String {
let mut out = String::new();
out.push_str(&format!("-- {NOTICE}\n"));
out.push_str("return {\n");
out.push_str(" rows = {\n");
for row in operator_rows() {
let aliases = row
.aliases
.iter()
.map(|a| lua_string(a))
.collect::<Vec<_>>()
.join(", ");
out.push_str(&format!(
" {{ ascii = {}, unicode = {}, aliases = {{{}}}, symbolic = {}, eager = {} }},\n",
lua_string(&row.ascii),
lua_string(&row.unicode),
if aliases.is_empty() {
aliases
} else {
format!(" {aliases} ")
},
lua_bool(row.symbolic),
lua_bool(row.eager),
));
}
out.push_str(" },\n");
out.push_str("}\n");
out
}
fn lua_bool(b: bool) -> &'static str {
if b { "true" } else { "false" }
}
pub(super) fn lua_string(s: &str) -> String {
let mut out = String::with_capacity(s.len() + 2);
out.push('"');
for c in s.chars() {
match c {
'\\' => out.push_str("\\\\"),
'"' => out.push_str("\\\""),
'\n' => out.push_str("\\n"),
'\r' => out.push_str("\\r"),
'\t' => out.push_str("\\t"),
_ => out.push(c),
}
}
out.push('"');
out
}