val 0.4.2

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

builtin! {
  Int {
    name: "int",
    arity: BuiltinArity::Exact(1),
    call(payload) {
      let value = &payload.arguments[0];

      match value {
        Value::Number(number) => Ok(Value::Number(number.floor())),
        Value::String(s) => Number::try_from(s.as_str())
          .map(|number| Value::Number(number.floor()))
          .map_err(|_| {
            Error::new(payload.span, format!("Cannot convert '{s}' to int"))
          }),
        Value::Boolean(b) => Ok(Value::Number(Number::from(*b))),
        _ => Err(Error::new(
          payload.span,
          format!("Cannot convert {} to int", value.type_name()),
        )),
      }
    }
  }
}