pub mod dump;
use crate::{
builtin_function::{
closure_gen,
utils::{get_var, param_to_datatype},
},
common::{
errors::Result,
executable::{BuiltinFunction, ExecutableLine},
param::Param,
},
runtime::Runtime,
};
pub fn debugger(runtime: &mut Runtime, executable: &ExecutableLine) -> Result<()> {
let mut params_values = Vec::new();
for param in &executable.params {
let param_str = if let Param::Tag(tag_name, _) = param {
("@".to_string() + tag_name).to_string()
} else {
param_to_datatype(runtime, Some(param), executable.line_number)?.to_string()
};
params_values.push(param_str);
}
let params_str = if params_values.is_empty() {
"Nothing".to_string()
} else {
params_values.join(", ")
};
let mut executable = executable.clone();
executable.function_name = executable.function_name.replace('?', "");
let real_function: BuiltinFunction = closure_gen(&executable)?;
real_function(runtime, &executable)?;
let return_str = if let Some(var_name) = &executable.output_var {
get_var(runtime, var_name, executable.line_number)?.to_string()
} else {
"Nothing".to_string()
};
runtime.std_out(
format!(
"debugger on line {}: {} -> {} -> {}",
executable.line_number, params_str, executable.function_name, return_str
)
.as_str(),
);
Ok(())
}