use mz_repr::explain::ExplainConfig;
use crate::{try_parse_def, try_parse_mir, Def, TestCatalog};
pub fn handle_define(catalog: &mut TestCatalog, input: &str) -> String {
let result = match try_parse_def(catalog, input) {
Ok(def) => match def {
Def::Source { name, cols, typ } => match catalog.insert(&name, cols, typ, true) {
Ok(id) => format!("Source defined as {id}"),
Err(err) => err,
},
},
Err(err) => err,
};
result + "\n"
}
pub fn handle_roundtrip(catalog: &TestCatalog, input: &str) -> String {
let output = match try_parse_mir(catalog, input) {
Ok(expr) => expr.explain(&ExplainConfig::default(), Some(catalog)),
Err(err) => return err,
};
if strip_comments(input).trim() == output.trim() {
"roundtrip OK\n".to_string()
} else {
format!(
"roundtrip produced a different output:\n~~~ expected:\n{}\n~~~ actual:\n{}\n~~~\n",
strip_comments(input),
output
)
}
}
fn strip_comments(s: &str) -> String {
let mut r = "".to_string();
for line in s.lines() {
let len = line.find("// {").unwrap_or(line.len());
r.push_str(line[0..len].trim_end());
r.push_str("\n");
}
r
}