use crate::{Value, VmError, vm::State};
use std::fmt::Write;
pub(super) fn print<'gc>(
_state: &mut State<'gc>,
args: Vec<Value<'gc>>,
) -> Result<Value<'gc>, VmError> {
let mut sep = " ";
let mut end = "\n";
let mut flush = false;
let mut i = 0;
let mut positional = Vec::new();
while i < args.len() {
match args[i] {
Value::String(key) if i + 1 < args.len() => {
match key.to_str().unwrap() {
"sep" => {
sep = args[i + 1].as_string()?.to_str().unwrap();
i += 2;
}
"end" => {
end = args[i + 1].as_string()?.to_str().unwrap();
i += 2;
}
"file" => {
i += 2;
}
"flush" => {
flush = args[i + 1].as_boolean();
i += 2;
}
_ => {
positional.push(&args[i]);
i += 1;
}
}
}
_ => {
positional.push(&args[i]);
i += 1;
}
}
}
let mut output = String::new();
for (i, arg) in positional.iter().enumerate() {
if i > 0 {
output.push_str(sep);
}
write!(output, "{}", arg).unwrap();
}
output.push_str(end);
print!("{}", output);
if flush {
std::io::Write::flush(&mut std::io::stdout()).unwrap();
}
Ok(Value::Nil)
}