use crate::evaluator::RuntimeError;
use crate::value::Value;
fn get_number(val: &Value) -> Result<f64, RuntimeError> {
match val {
Value::Number(n) => Ok(*n),
_ => Err(RuntimeError::TypeErrorDetailed {
expected: "Number".to_string(),
got: format!("{:?}", val),
}),
}
}
pub fn calc_meal_allowance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.len() < 2 {
return Err(RuntimeError::WrongArity {
expected: 2,
got: args.len(),
});
}
let daily_allowance = get_number(&args[0])?;
let attendance_days = get_number(&args[1])?;
Ok(Value::Number(daily_allowance * attendance_days))
}
pub fn calc_transport_allowance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.len() < 2 {
return Err(RuntimeError::WrongArity {
expected: 2,
got: args.len(),
});
}
let daily_allowance = get_number(&args[0])?;
let attendance_days = get_number(&args[1])?;
Ok(Value::Number(daily_allowance * attendance_days))
}
pub fn calc_communication_allowance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.len() < 2 {
return Err(RuntimeError::WrongArity {
expected: 2,
got: args.len(),
});
}
let monthly_allowance = get_number(&args[0])?;
let worked_days = get_number(&args[1])?;
let standard_days = if args.len() > 2 {
get_number(&args[2])?
} else {
21.75
};
Ok(Value::Number(
monthly_allowance * worked_days / standard_days,
))
}
pub fn calc_housing_allowance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.len() < 2 {
return Err(RuntimeError::WrongArity {
expected: 2,
got: args.len(),
});
}
let monthly_allowance = get_number(&args[0])?;
let worked_months = get_number(&args[1])?;
Ok(Value::Number(monthly_allowance * worked_months))
}
pub fn calc_high_temp_allowance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.len() < 2 {
return Err(RuntimeError::WrongArity {
expected: 2,
got: args.len(),
});
}
let daily_allowance = get_number(&args[0])?;
let high_temp_days = get_number(&args[1])?;
Ok(Value::Number(daily_allowance * high_temp_days))
}
pub fn calc_night_shift_allowance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.len() < 2 {
return Err(RuntimeError::WrongArity {
expected: 2,
got: args.len(),
});
}
let per_shift_allowance = get_number(&args[0])?;
let night_shifts = get_number(&args[1])?;
Ok(Value::Number(per_shift_allowance * night_shifts))
}
pub fn calc_position_allowance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.len() < 2 {
return Err(RuntimeError::WrongArity {
expected: 2,
got: args.len(),
});
}
let monthly_allowance = get_number(&args[0])?;
let worked_months = get_number(&args[1])?;
Ok(Value::Number(monthly_allowance * worked_months))
}