use crate::eval::coercion::to_string_val;
use crate::eval::functions::check_arity;
use crate::types::{ErrorKind, Value};
pub fn value_fn(args: &[Value]) -> Value {
if let Some(err) = check_arity(args, 1, 1) {
return err;
}
let text = match to_string_val(args[0].clone()) {
Ok(s) => s,
Err(e) => return e,
};
let trimmed = text.trim();
if trimmed.is_empty() {
return Value::Number(0.0);
}
if let Ok(n) = trimmed.parse::<f64>() {
return Value::Number(n);
}
if let Some(pct) = trimmed.strip_suffix('%') {
if let Ok(n) = pct.trim().replace(',', "").parse::<f64>() {
return Value::Number(n / 100.0);
}
}
if let Some(rest) = trimmed.strip_prefix('$') {
if let Ok(n) = rest.trim().replace(',', "").parse::<f64>() {
return Value::Number(n);
}
}
let no_commas = trimmed.replace(',', "");
if let Ok(n) = no_commas.parse::<f64>() {
return Value::Number(n);
}
Value::Error(ErrorKind::Value)
}
#[cfg(test)]
mod tests;