clover-std 0.1.3

A scripting language.
Documentation
use clover::{State, Object};
use clover::debug::RuntimeError;
use crate::helper::expect_parameter_count;

pub fn pow(state: &mut State, parameters: &[ Object ]) -> Result<Object, RuntimeError> {
    expect_parameter_count(state, parameters, 2)?;

    let base_object = parameters[0].clone();
    let exponent_object = parameters[1].clone();

    let type_error = Err(RuntimeError::new("Math.pow can accept Integer or Float only", state.last_position()));

    Ok(match base_object {
        Object::Integer(base) => {
            match exponent_object {
                Object::Integer(exponent) => {
                    if exponent >= 0 {
                        Object::Integer(base.pow(exponent as u32))
                    } else {
                        return Err(RuntimeError::new("Integer can have exponent greater or equal zero", state.last_position()));
                    }
                },
                Object::Float(exponent) => {
                    Object::Float((base as f64).powf(exponent))
                }
                _ => { return type_error; }
            }

        },
        Object::Float(base) => {
            match exponent_object {
                Object::Integer(exponent) => {
                    Object::Float(base.powf(exponent as f64))
                },
                Object::Float(exponent) => {
                    Object::Float(base.powf(exponent))
                }
                _ => { return type_error; }
            }
        }
        _ => { return type_error; }
    })
}