use std::any::Any;
use std::cell::RefCell;
use std::fmt;
use std::rc::Rc;
use hirola_core::generic_node::NodeReference;
use crate::Dom;
#[derive(Clone, PartialEq, Eq)]
pub struct NodeRef(Rc<RefCell<Option<Dom>>>);
impl NodeRef {
pub fn new() -> Self {
Self(Rc::new(RefCell::new(None)))
}
pub fn get(&self) -> Dom {
self.try_get().expect("NodeRef is not set")
}
fn inner_try_get(&self) -> Option<Dom> {
let obj = self.0.borrow();
(obj.as_ref()? as &dyn Any).downcast_ref().cloned()
}
pub fn get_raw(&self) -> Dom {
self.try_get().expect("NodeRef is not set")
}
pub fn try_get_raw(&self) -> Option<Dom> {
self.0.borrow().clone()
}
fn inner_set(&self, node: Dom) {
*self.0.borrow_mut() = Some(node);
}
}
impl Default for NodeRef {
fn default() -> Self {
Self::new()
}
}
impl fmt::Debug for NodeRef {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("NodeRef").field(&self.0.borrow()).finish()
}
}
impl NodeReference for NodeRef {
type Target = Dom;
fn set(&self, node: Self::Target) {
self.inner_set(node)
}
fn try_get(&self) -> Option<Self::Target> {
self.inner_try_get()
}
}