use crate::{Environment, eval::apply::eval_apply, value::Value};
pub(crate) fn builtin(args: &[Value], is_upper: bool, env: Environment) -> Result<Value, std::sync::Arc<str>> {
if let [val] = args {
match eval_apply(val, env)? {
Value::String(s) => Ok(Value::String(std::sync::Arc::from(if is_upper {
s.to_uppercase()
} else {
s.to_lowercase()
}))),
e => Err(std::sync::Arc::from(format!(
concat!(
"Error[ksl::builtin::{}]: ",
"Expected a string, but got: `{}`."
),
if is_upper { "Uppercase" } else { "Lowercase" },
e
))),
}
} else {
Err(std::sync::Arc::from(format!(
concat!(
"Error[ksl::builtin::{}]: ",
"Expected 1 parameter, but {} were passed."
),
if is_upper { "Uppercase" } else { "Lowercase" },
args.len()
)))
}
}