use crate::node_id::NodeId;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum NodeOrString {
Node(NodeId),
Text(String),
}
impl From<NodeId> for NodeOrString {
fn from(id: NodeId) -> Self {
NodeOrString::Node(id)
}
}
impl From<String> for NodeOrString {
fn from(s: String) -> Self {
NodeOrString::Text(s)
}
}
impl From<&str> for NodeOrString {
fn from(s: &str) -> Self {
NodeOrString::Text(s.to_string())
}
}
impl From<&String> for NodeOrString {
fn from(s: &String) -> Self {
NodeOrString::Text(s.clone())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Dom;
#[test]
fn from_node_id_produces_node_variant() {
let mut dom: Dom = Dom::new();
let n = dom.create_element("p");
let v: NodeOrString = n.into();
assert_eq!(v, NodeOrString::Node(n));
}
#[test]
fn from_str_produces_text_variant() {
let v: NodeOrString = "hello".into();
assert_eq!(v, NodeOrString::Text("hello".into()));
}
#[test]
fn from_string_produces_text_variant() {
let v: NodeOrString = String::from("hello").into();
assert_eq!(v, NodeOrString::Text("hello".into()));
}
#[test]
fn from_string_ref_clones_and_produces_text_variant() {
let s = String::from("hello");
let v: NodeOrString = (&s).into();
assert_eq!(v, NodeOrString::Text("hello".into()));
assert_eq!(s, "hello");
}
#[test]
fn variadic_ergonomics_via_into_iterator() {
let mut dom: Dom = Dom::new();
let strong = dom.create_element("strong");
let em = dom.create_element("em");
let items: Vec<NodeOrString> = vec![
"before ".into(),
strong.into(),
" mid ".into(),
em.into(),
" after".into(),
];
assert_eq!(items.len(), 5);
match &items[0] {
NodeOrString::Text(s) => assert_eq!(s, "before "),
_ => panic!("expected Text variant"),
}
match &items[1] {
NodeOrString::Node(n) => assert_eq!(*n, strong),
_ => panic!("expected Node variant"),
}
match &items[4] {
NodeOrString::Text(s) => assert_eq!(s, " after"),
_ => panic!("expected Text variant"),
}
}
#[test]
fn distinct_variants_compare_not_equal() {
let mut dom: Dom = Dom::new();
let n = dom.create_element("p");
let from_node = NodeOrString::Node(n);
let from_text = NodeOrString::Text("p".into());
assert_ne!(from_node, from_text);
}
}