use crate::{Environment, eval::apply::eval_apply, value::Value};
pub(crate) fn builtin(args: &[Value], env: Environment) -> Result<Value, std::sync::Arc<str>> {
let mut term = console::Term::stdout();
if args.len() < 2 {
let buf = if args.is_empty() {
String::from("> ")
} else {
match eval_apply(&args[0], env)? {
Value::String(p) => format!("{p} "),
e => {
return Err(std::sync::Arc::from(format!(
concat!(
"Error[ksl::builtin::Input]: ",
"Expected a string as prompt, but got: `{}`."
),
e
)));
}
}
};
std::io::Write::write(&mut term, buf.as_bytes())
.and(term.flush())
.or(Err(std::sync::Arc::from(concat!(
"Error[ksl::builtin::Input]: ",
"Failed to refresh REPL output buffer."
))))?;
Ok(Value::String(std::sync::Arc::from(term.read_line().or(
Err(std::sync::Arc::from(concat!(
"Error[ksl::builtin::Input]: ",
"Failed to get user input."
))),
)?)))
} else {
Err(std::sync::Arc::from(format!(
concat!(
"Error[ksl::builtin::Input]: ",
"Expected at most 1 parameter, but {} were passed."
),
args.len()
)))
}
}