use std::collections::BTreeMap;
use boa_cat::Value;
use boa_cat::fuel::Fuel;
use boa_cat::heap::Heap;
use boa_cat::outcome::{EvalResult, Outcome};
use boa_cat::value::Object;
use crate::coercion::{first_arg, to_string};
#[allow(clippy::needless_pass_by_value, clippy::unnecessary_wraps)]
pub fn error_impl(args: Vec<Value>, _this: Value, heap: Heap, fuel: Fuel) -> EvalResult {
Ok(build_error("Error", &args, heap, fuel))
}
#[allow(clippy::needless_pass_by_value, clippy::unnecessary_wraps)]
pub fn type_error_impl(args: Vec<Value>, _this: Value, heap: Heap, fuel: Fuel) -> EvalResult {
Ok(build_error("TypeError", &args, heap, fuel))
}
#[allow(clippy::needless_pass_by_value, clippy::unnecessary_wraps)]
pub fn range_error_impl(args: Vec<Value>, _this: Value, heap: Heap, fuel: Fuel) -> EvalResult {
Ok(build_error("RangeError", &args, heap, fuel))
}
#[allow(clippy::needless_pass_by_value, clippy::unnecessary_wraps)]
pub fn syntax_error_impl(args: Vec<Value>, _this: Value, heap: Heap, fuel: Fuel) -> EvalResult {
Ok(build_error("SyntaxError", &args, heap, fuel))
}
#[allow(clippy::needless_pass_by_value, clippy::unnecessary_wraps)]
pub fn reference_error_impl(args: Vec<Value>, _this: Value, heap: Heap, fuel: Fuel) -> EvalResult {
Ok(build_error("ReferenceError", &args, heap, fuel))
}
#[allow(clippy::needless_pass_by_value, clippy::unnecessary_wraps)]
pub fn eval_error_impl(args: Vec<Value>, _this: Value, heap: Heap, fuel: Fuel) -> EvalResult {
Ok(build_error("EvalError", &args, heap, fuel))
}
#[allow(clippy::needless_pass_by_value, clippy::unnecessary_wraps)]
pub fn uri_error_impl(args: Vec<Value>, _this: Value, heap: Heap, fuel: Fuel) -> EvalResult {
Ok(build_error("URIError", &args, heap, fuel))
}
fn build_error(name: &str, args: &[Value], heap: Heap, fuel: Fuel) -> (Outcome, Heap, Fuel) {
let message_value = first_arg(args);
let message = match message_value {
Value::Undefined => String::new(),
Value::Null
| Value::Boolean(_)
| Value::Number(_)
| Value::String(_)
| Value::Object(_)
| Value::Function(_)
| Value::Native(_)
| Value::Promise(_) => to_string(&message_value, &heap),
};
let mut props = BTreeMap::new();
let _ = props.insert("name".to_owned(), Value::String(name.to_owned()));
let _ = props.insert("message".to_owned(), Value::String(message));
let (id, heap) = heap.alloc_object(Object::from_properties(props));
(Outcome::Normal(Value::Object(id)), heap, fuel)
}