spair 0.0.9

A framework for single-page application in Rust
Documentation
use crate::dom::{AChildNode, Element, MaybeAChildNode};
use wasm_bindgen::UnwrapThrowExt;

mod list;
mod nodes;
mod text;

pub use list::*;
pub use nodes::*;
pub use text::*;

pub enum QrNode {
    ClonedWsNode(Option<web_sys::Node>),
    Text(QrTextNode),
    List(QrListRepresentative),
    Group(QrGroupRepresentative),
}

impl MaybeAChildNode for QrNode {
    fn ws_node(&self) -> Option<&web_sys::Node> {
        match self {
            Self::ClonedWsNode(ws) => ws.as_ref(),
            Self::Text(tn) => Some(tn.ws_node()),
            Self::List(r) => r.end_flag_node(),
            Self::Group(g) => Some(g.end_flag_node()),
        }
    }
}

impl QrNode {
    pub fn get_first_element(&self) -> Option<&Element> {
        match self {
            Self::ClonedWsNode(_) => None,
            Self::Text(_) => None,
            Self::List(_) => None,
            Self::Group(_) => None,
        }
    }

    pub fn get_last_element(&self) -> Option<&Element> {
        match self {
            Self::ClonedWsNode(_) => None,
            Self::Text(_) => None,
            Self::List(_) => None,
            Self::Group(_) => None,
        }
    }
}

impl Clone for QrNode {
    fn clone(&self) -> Self {
        match self {
            Self::ClonedWsNode(wsn) => Self::ClonedWsNode(wsn.as_ref().map(|wsn| {
                wsn.clone_node_with_deep(false)
                    .expect_throw("dom::queue_render::text::Clone for QrNode::clone")
            })),
            Self::Text(tn) => Self::ClonedWsNode(Some(tn.clone_ws_node())),
            Self::List(l) => Self::ClonedWsNode(l.end_flag_node().cloned()),
            Self::Group(l) => Self::ClonedWsNode(Some(l.end_flag_node().clone())),
        }
    }
}