use super::*;
impl<T: ?Sized> NodeRef<T> {
pub fn new() -> Self {
Self::default()
}
pub fn get(&self) -> Option<JsValue> {
let cell: *mut Option<JsValue> = self.inner.get();
unsafe { (*cell).as_ref().cloned() }
}
pub fn get_cloned(&self) -> Option<T>
where
T: JsCast,
{
let value: JsValue = self.get()?;
value.dyn_into::<T>().ok()
}
pub fn set(&self, value: JsValue) {
let cell: *mut Option<JsValue> = self.inner.get();
unsafe {
let _: Option<JsValue> = (*cell).replace(value);
}
}
pub fn clear(&self) {
let cell: *mut Option<JsValue> = self.inner.get();
unsafe {
let _: Option<JsValue> = (*cell).take();
}
}
pub fn is_set(&self) -> bool {
let cell: *const Option<JsValue> = self.inner.get();
unsafe { (*cell).is_some() }
}
}
impl<T: ?Sized> Clone for NodeRef<T> {
fn clone(&self) -> Self {
Self {
inner: self.inner.clone(),
_marker: PhantomData,
}
}
}
impl<T: ?Sized> Default for NodeRef<T> {
fn default() -> Self {
Self {
inner: Rc::new(UnsafeCell::new(None)),
_marker: PhantomData,
}
}
}
impl<T: ?Sized> Debug for NodeRef<T> {
fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
formatter
.debug_struct("NodeRef")
.field("is_set", &self.is_set())
.finish()
}
}