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_pension_insurance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.is_empty() {
return Err(RuntimeError::WrongArity {
expected: 1,
got: 0,
});
}
let base = get_number(&args[0])?;
let rate = if args.len() > 1 {
get_number(&args[1])?
} else {
0.08 };
Ok(Value::Number(base * rate))
}
pub fn calc_medical_insurance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.is_empty() {
return Err(RuntimeError::WrongArity {
expected: 1,
got: 0,
});
}
let base = get_number(&args[0])?;
let rate = if args.len() > 1 {
get_number(&args[1])?
} else {
0.02 };
Ok(Value::Number(base * rate))
}
pub fn calc_unemployment_insurance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.is_empty() {
return Err(RuntimeError::WrongArity {
expected: 1,
got: 0,
});
}
let base = get_number(&args[0])?;
let rate = if args.len() > 1 {
get_number(&args[1])?
} else {
0.005 };
Ok(Value::Number(base * rate))
}
pub fn calc_housing_fund(args: &[Value]) -> Result<Value, RuntimeError> {
if args.is_empty() {
return Err(RuntimeError::WrongArity {
expected: 1,
got: 0,
});
}
let base = get_number(&args[0])?;
let rate = if args.len() > 1 {
get_number(&args[1])?
} else {
0.12 };
Ok(Value::Number(base * rate))
}
pub fn calc_social_insurance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.is_empty() {
return Err(RuntimeError::WrongArity {
expected: 1,
got: 0,
});
}
let base = get_number(&args[0])?;
let pension_rate = if args.len() > 1 {
get_number(&args[1])?
} else {
0.08 };
let medical_rate = if args.len() > 2 {
get_number(&args[2])?
} else {
0.02 };
let unemployment_rate = if args.len() > 3 {
get_number(&args[3])?
} else {
0.005 };
let housing_rate = if args.len() > 4 {
get_number(&args[4])?
} else {
0.12 };
let total = base * (pension_rate + medical_rate + unemployment_rate + housing_rate);
Ok(Value::Number(total))
}
pub fn calc_total_insurance_fund(args: &[Value]) -> Result<Value, RuntimeError> {
if args.len() < 2 {
return Err(RuntimeError::WrongArity {
expected: 2,
got: args.len(),
});
}
let social_insurance = get_number(&args[0])?;
let housing_fund = get_number(&args[1])?;
Ok(Value::Number(social_insurance + housing_fund))
}
pub fn adjust_social_base(args: &[Value]) -> Result<Value, RuntimeError> {
if args.len() < 3 {
return Err(RuntimeError::WrongArity {
expected: 3,
got: args.len(),
});
}
let salary = get_number(&args[0])?;
let lower_limit = get_number(&args[1])?;
let upper_limit = get_number(&args[2])?;
let adjusted = if salary < lower_limit {
lower_limit
} else if salary > upper_limit {
upper_limit
} else {
salary
};
Ok(Value::Number(adjusted))
}
pub fn calc_social_base_lower(args: &[Value]) -> Result<Value, RuntimeError> {
if args.is_empty() {
return Err(RuntimeError::WrongArity {
expected: 1,
got: 0,
});
}
let avg_salary = get_number(&args[0])?;
let ratio = if args.len() > 1 {
get_number(&args[1])?
} else {
0.6
};
Ok(Value::Number(avg_salary * ratio))
}
pub fn calc_social_base_upper(args: &[Value]) -> Result<Value, RuntimeError> {
if args.is_empty() {
return Err(RuntimeError::WrongArity {
expected: 1,
got: 0,
});
}
let avg_salary = get_number(&args[0])?;
let multiplier = if args.len() > 1 {
get_number(&args[1])?
} else {
3.0
};
Ok(Value::Number(avg_salary * multiplier))
}
pub fn calc_injury_insurance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.is_empty() {
return Err(RuntimeError::WrongArity {
expected: 1,
got: 0,
});
}
let base = get_number(&args[0])?;
let rate = if args.len() > 1 {
get_number(&args[1])?
} else {
0.002 };
Ok(Value::Number(base * rate))
}
pub fn calc_maternity_insurance(args: &[Value]) -> Result<Value, RuntimeError> {
if args.is_empty() {
return Err(RuntimeError::WrongArity {
expected: 1,
got: 0,
});
}
let base = get_number(&args[0])?;
let rate = if args.len() > 1 {
get_number(&args[1])?
} else {
0.008 };
Ok(Value::Number(base * rate))
}