use dom_struct::dom_struct;
use indexmap::IndexMap;
use js::context::JSContext;
use js::rust::HandleObject;
use script_bindings::cell::DomRefCell;
use script_bindings::cformat;
use script_bindings::like::Maplike;
use script_bindings::reflector::{Reflector, reflect_dom_object_with_proto};
use crate::dom::bindings::codegen::Bindings::TestBindingMaplikeWithPrimitiveBinding::TestBindingMaplikeWithPrimitiveMethods;
use crate::dom::bindings::error::{Error, Fallible};
use crate::dom::bindings::root::DomRoot;
use crate::dom::bindings::str::DOMString;
use crate::dom::globalscope::GlobalScope;
use crate::maplike;
#[dom_struct]
pub(crate) struct TestBindingMaplikeWithPrimitive {
reflector: Reflector,
#[custom_trace]
internal: DomRefCell<IndexMap<DOMString, i32>>,
}
impl TestBindingMaplikeWithPrimitive {
fn new(
cx: &mut JSContext,
global: &GlobalScope,
proto: Option<HandleObject>,
) -> DomRoot<TestBindingMaplikeWithPrimitive> {
reflect_dom_object_with_proto(
cx,
Box::new(TestBindingMaplikeWithPrimitive {
reflector: Reflector::new(),
internal: DomRefCell::new(IndexMap::new()),
}),
global,
proto,
)
}
}
impl TestBindingMaplikeWithPrimitiveMethods<crate::DomTypeHolder>
for TestBindingMaplikeWithPrimitive
{
fn Constructor(
cx: &mut JSContext,
global: &GlobalScope,
proto: Option<HandleObject>,
) -> Fallible<DomRoot<TestBindingMaplikeWithPrimitive>> {
Ok(TestBindingMaplikeWithPrimitive::new(cx, global, proto))
}
fn SetInternal(&self, cx: &mut JSContext, key: DOMString, value: i32) {
self.internal.set(cx, key, value)
}
fn ClearInternal(&self, cx: &mut JSContext) {
self.internal.clear(cx)
}
fn DeleteInternal(&self, cx: &mut JSContext, key: DOMString) -> bool {
self.internal.delete(cx, key)
}
fn HasInternal(&self, cx: &mut JSContext, key: DOMString) -> bool {
self.internal.has(cx, key)
}
fn GetInternal(&self, key: DOMString) -> Fallible<i32> {
self.internal
.borrow()
.get(&key)
.ok_or_else(|| Error::Type(cformat!("No entry for key {key}")))
.copied()
}
fn Size(&self, cx: &mut JSContext) -> u32 {
self.internal.size(cx)
}
}
impl Maplike for TestBindingMaplikeWithPrimitive {
type Key = DOMString;
type Value = i32;
maplike!(self, internal);
}