use std::sync::Arc;
use mers_lib::{
data::{Data, MersDataWInfo, Type},
errors::CheckError,
prelude_compile::{parse, Config, Source},
program::parsed::CompInfo,
};
fn main() {
show("1.sum(2)".to_owned());
show("1.sum(2).println".to_owned());
show("1.sum(2.5)".to_owned());
show("if true { 1 } else { 0.5 }".to_owned());
}
fn show(src: String) {
eprintln!(
"-{}",
" -".repeat(src.lines().map(|l| l.len()).max().unwrap_or(0) / 2)
);
eprintln!("{src}");
match parse_compile_check_run(src) {
Err(e) => eprintln!("{e:?}"),
Ok((t, v, i)) => eprintln!(
"Returned `{}` :: `{}`",
v.get().with_info(&i),
t.with_info(&i)
),
}
}
fn parse_compile_check_run(
src: String,
) -> Result<(Type, Data, mers_lib::program::run::Info), CheckError> {
let mut source = Source::new_from_string(src);
let srca = Arc::new(source.clone());
let parsed = parse(&mut source, &srca)?;
let (mut i1, mut i2, mut i3) = Config::new().bundle_std().infos();
let compiled = parsed.compile(&mut i1, CompInfo::default())?;
let output_type = compiled.check(&mut i3, None)?;
let output_value = compiled.run(&mut i2)?;
assert!(output_value.get().as_type().is_included_in(&output_type));
Ok((output_type, output_value, i2))
}