use super::Selector;
use crate::{Element, Node};
pub trait Queryable {
fn query(&self, selector: &Selector) -> Option<&Element>;
fn query_all(&self, selector: &Selector) -> Vec<&Element>;
fn query_mut(&mut self, selector: &Selector) -> Option<&mut Element>;
fn execute_for(&mut self, selector: &Selector, f: impl FnMut(&mut Element));
}
fn nodes_execute_for_internal(
nodes: &mut Vec<Node>,
selector: &Selector,
f: &mut impl FnMut(&mut Element),
) {
for node in nodes {
if let Some(element) = node.as_element_mut() {
element_execute_for_internal(element, selector, f);
}
}
}
fn element_execute_for_internal(
element: &mut Element,
selector: &Selector,
f: &mut impl FnMut(&mut Element),
) {
if selector.matches(element) {
f(element);
}
nodes_execute_for_internal(&mut element.children, selector, f);
}
impl Queryable for Vec<Node> {
fn query(&self, selector: &Selector) -> Option<&Element> {
for node in self {
if let Some(element) = node.as_element() {
if let Some(elem) = element.query(selector) {
return Some(elem);
}
}
}
None
}
fn query_all(&self, selector: &Selector) -> Vec<&Element> {
let mut elements = Vec::new();
for node in self {
if let Some(element) = node.as_element() {
let sub_elements = element.query_all(selector);
elements.extend(sub_elements);
}
}
elements
}
fn query_mut(&mut self, selector: &Selector) -> Option<&mut Element> {
for node in self {
if let Some(element) = node.as_element_mut() {
if let Some(elem) = element.query_mut(selector) {
return Some(elem);
}
}
}
None
}
fn execute_for(&mut self, selector: &Selector, mut f: impl FnMut(&mut Element)) {
nodes_execute_for_internal(self, selector, &mut f);
}
}
impl Queryable for Element {
fn query(&self, selector: &Selector) -> Option<&Element> {
if selector.matches(self) {
Some(self)
} else {
self.children.query(selector)
}
}
fn query_all(&self, selector: &Selector) -> Vec<&Element> {
let mut elements = self.children.query_all(selector);
if selector.matches(self) {
elements.push(self);
}
elements
}
fn query_mut(&mut self, selector: &Selector) -> Option<&mut Element> {
if selector.matches(self) {
Some(self)
} else {
self.children.query_mut(selector)
}
}
fn execute_for(&mut self, selector: &Selector, mut f: impl FnMut(&mut Element)) {
element_execute_for_internal(self, selector, &mut f);
}
}
impl Queryable for Node {
fn query(&self, selector: &Selector) -> Option<&Element> {
if let Some(element) = self.as_element() {
element.query(selector)
} else {
None
}
}
fn query_all(&self, selector: &Selector) -> Vec<&Element> {
if let Some(element) = self.as_element() {
element.query_all(selector)
} else {
Vec::new()
}
}
fn query_mut(&mut self, selector: &Selector) -> Option<&mut Element> {
if let Some(element) = self.as_element_mut() {
element.query_mut(selector)
} else {
None
}
}
fn execute_for(&mut self, selector: &Selector, f: impl FnMut(&mut Element)) {
if let Some(element) = self.as_element_mut() {
element.execute_for(selector, f);
}
}
}