use crate::model::{FloatType, IntType, List, RuntimeError, Value};
pub fn require_parameter<'a>(
func_name: &str,
args: &'a [Value],
index: usize,
) -> Result<&'a Value, RuntimeError> {
match args.get(index) {
Some(val) => Ok(val),
None => Err(RuntimeError {
msg: format!(
"Function \"{}\" requires an argument {}",
func_name,
index + 1
),
}),
}
}
pub fn require_int_parameter(
func_name: &str,
args: &[Value],
index: usize,
) -> Result<IntType, RuntimeError> {
match require_parameter(func_name, args, index) {
Ok(val) => match val.as_int() {
Some(x) => Ok(x),
None => Err(RuntimeError {
msg: format!(
"Function \"{}\" requires argument {} to be an integer; got {}",
func_name,
index,
val.type_name()
),
}),
},
Err(err) => Err(err),
}
}
pub fn require_float_parameter(
func_name: &str,
args: &[Value],
index: usize,
) -> Result<FloatType, RuntimeError> {
match require_parameter(func_name, args, index) {
Ok(val) => match val.as_float() {
Some(x) => Ok(x),
None => Err(RuntimeError {
msg: format!(
"Function \"{}\" requires argument {} to be a float; got {}",
func_name,
index,
val.type_name()
),
}),
},
Err(err) => Err(err),
}
}
pub fn require_string_parameter<'a>(
func_name: &str,
args: &'a [Value],
index: usize,
) -> Result<&'a str, RuntimeError> {
match require_parameter(func_name, args, index) {
Ok(val) => match val.as_string() {
Some(x) => Ok(x),
None => Err(RuntimeError {
msg: format!(
"Function \"{}\" requires argument {} to be a string; got {}",
func_name,
index,
val.type_name()
),
}),
},
Err(err) => Err(err),
}
}
pub fn require_list_parameter<'a>(
func_name: &str,
args: &'a [Value],
index: usize,
) -> Result<&'a List, RuntimeError> {
match require_parameter(func_name, args, index) {
Ok(val) => match val {
Value::List(list) => Ok(list),
_ => Err(RuntimeError {
msg: format!(
"Function \"{}\" requires argument {} to be a list; got {}",
func_name,
index,
val.type_name()
),
}),
},
Err(err) => Err(err),
}
}