use crate::body::Body;
use crate::element::sub::SubElement;
use crate::element::sub::definition::SubElementDefinition;
use crate::element::{Element, definition::ElementDefinition};
use crate::error::{ElementError, WebDynproError};
use scraper::Html;
pub struct ElementParser(Html);
unsafe impl Send for ElementParser {}
unsafe impl Sync for ElementParser {}
impl<'s> ElementParser {
pub fn new(body: &Body) -> Self {
let document = Html::parse_document(body.raw_body());
Self(document)
}
pub fn element_from_def<T: ElementDefinition<'s>>(
&'s self,
definition: &T,
) -> Result<T::Element, WebDynproError> {
let selector = definition.selector()?;
let element_ref = self
.0
.select(&selector)
.next()
.ok_or(ElementError::InvalidId(definition.id().to_string()))?;
Element::from_ref(definition, element_ref)
}
pub fn subelement_from_def<T: SubElementDefinition<'s>>(
&'s self,
definition: &T,
) -> Result<T::SubElement, WebDynproError> {
let selector = definition.selector()?;
let element_ref = self
.0
.select(&selector)
.next()
.ok_or(ElementError::InvalidId(definition.id().to_string()))?;
SubElement::from_ref(definition, element_ref)
}
pub fn document(&'s self) -> &'s Html {
&self.0
}
}