val 0.6.0

An arbitrary precision calculator language
Documentation
use super::*;

builtin! {
  Input {
    name: "input",
    arity: BuiltinArity::Range(0, 1),
    call(payload) {
      use std::io::{self, BufRead, Write};

      if payload.arguments.len() == 1 {
        print!("{}", payload.arguments[0].string(payload.span)?);
        io::stdout().flush().unwrap();
      }

      let stdin = io::stdin();

      let mut input = String::new();

      match stdin.lock().read_line(&mut input) {
        Ok(_) => {
          if input.ends_with('\n') {
            input.pop();

            if input.ends_with('\r') {
              input.pop();
            }
          }

          Ok(Value::String(input))
        }
        Err(e) => Err(Error::new(
          payload.span,
          format!("Failed to read input: {e}"),
        )),
      }
    }
  }
}