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_and_cx};
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_and_cx(
Box::new(TestBindingMaplikeWithPrimitive {
reflector: Reflector::new(),
internal: DomRefCell::new(IndexMap::new()),
}),
global,
proto,
cx,
)
}
}
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, key: DOMString, value: i32) {
self.internal.set(key, value)
}
fn ClearInternal(&self) {
self.internal.clear()
}
fn DeleteInternal(&self, key: DOMString) -> bool {
self.internal.delete(key)
}
fn HasInternal(&self, key: DOMString) -> bool {
self.internal.has(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) -> u32 {
self.internal.size()
}
}
impl Maplike for TestBindingMaplikeWithPrimitive {
type Key = DOMString;
type Value = i32;
maplike!(self, internal);
}