ksl 0.1.30

KSL core library and interpreter
Documentation
//! # ksl::builtin::input
//!
//! Built-in function `Input`.

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()
        )))
    }
}