val 0.4.2

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

builtin! {
  Exit {
    name: "exit",
    aliases: ["quit"],
    arity: BuiltinArity::Range(0, 1),
    call(payload) {
      let name = payload.name;

      let code = if payload.arguments.is_empty() {
        0
      } else {
        let Some(code) = payload.arguments[0]
          .number(payload.span)?
          .to_non_negative_usize()
        else {
          return Err(Error::new(
            payload.span,
            format!("Argument to `{name}` must be a non-negative finite number"),
          ));
        };

        let Ok(code) = i32::try_from(code) else {
          return Err(Error::new(
            payload.span,
            format!("Argument to `{name}` must fit in a 32-bit signed integer"),
          ));
        };

        code
      };

      Err(Error::Exit {
        code,
        span: payload.span,
      })
    }
  }
}