jsbind/
record.rs

1use core::marker::PhantomData;
2use core::ops::{Deref, DerefMut};
3use emlite::FromVal;
4
5/// Web‑IDL `record<K, V>` wrapper.
6#[derive(Clone, Debug, PartialEq, PartialOrd)]
7#[repr(transparent)]
8pub struct Record<K, V> {
9    /// Underlying JavaScript object.
10    inner: emlite::Val,
11    /// Marks the key type at compile‑time.
12    phantom1: PhantomData<K>,
13    /// Marks the value type at compile‑time.
14    phantom2: PhantomData<V>,
15}
16
17impl<K, V> emlite::FromVal for Record<K, V> {
18    fn from_val(v: &emlite::Val) -> Self {
19        Self {
20            inner: v.clone(),
21            phantom1: PhantomData,
22            phantom2: PhantomData,
23        }
24    }
25    fn take_ownership(v: emlite::env::Handle) -> Self {
26        Self::from_val(&emlite::Val::take_ownership(v))
27    }
28    fn as_handle(&self) -> emlite::env::Handle {
29        self.inner.as_handle()
30    }
31}
32
33impl<K, V> From<Record<K, V>> for emlite::Val {
34    fn from(x: Record<K, V>) -> emlite::Val {
35        let handle = x.inner.as_handle();
36        core::mem::forget(x);
37        emlite::Val::take_ownership(handle)
38    }
39}
40
41impl<K, V> Deref for Record<K, V> {
42    type Target = emlite::Val;
43
44    fn deref(&self) -> &Self::Target {
45        &self.inner
46    }
47}
48
49impl<K, V> DerefMut for Record<K, V> {
50    fn deref_mut(&mut self) -> &mut Self::Target {
51        &mut self.inner
52    }
53}
54
55impl<K, V> AsRef<emlite::Val> for Record<K, V> {
56    fn as_ref(&self) -> &emlite::Val {
57        &self.inner
58    }
59}
60
61impl<K, V> AsMut<emlite::Val> for Record<K, V> {
62    fn as_mut(&mut self) -> &mut emlite::Val {
63        &mut self.inner
64    }
65}
66
67impl<K, V> Record<K, V> {
68    pub fn set(&self, item: K, val: V)
69    where
70        emlite::Val: From<K>,
71        emlite::Val: From<V>,
72    {
73        self.inner.set(item, val);
74    }
75
76    pub fn get(&self, item: K) -> V
77    where
78        emlite::Val: From<K>,
79        emlite::Val: From<V>,
80        V: FromVal,
81    {
82        self.inner.get(item).as_::<V>()
83    }
84
85    /// Returns whether a value exists in the sequence.
86    pub fn has(&self, item: K) -> bool
87    where
88        emlite::Val: From<K>,
89    {
90        self.inner.has(item)
91    }
92}