use std::borrow::Cow;
use scraper::Selector;
use crate::{
element::{Element, definition::ElementDefinition, sub::SubElement},
error::{ElementError, WebDynproError},
};
pub trait SubElementDefinition<'body>: Sized {
type Parent: Element<'body>;
type SubElement: SubElement<'body>;
fn new_dynamic(parent: <Self::Parent as Element<'body>>::Def, id: String) -> Self;
fn from_ref(
parent: <Self::Parent as Element<'body>>::Def,
element: scraper::ElementRef<'body>,
) -> Result<Self, WebDynproError>;
fn id(&self) -> &str;
fn id_cow(&self) -> Cow<'static, str>;
fn parent(&self) -> &<Self::Parent as Element<'body>>::Def;
fn selector(&self) -> Result<Selector, WebDynproError> {
Selector::parse(format!(r#"[id="{}"] [id="{}"]"#, self.parent().id(), self.id()).as_str())
.or_else(|e| {
tracing::warn!(?e, "failed to parse selector");
Err(ElementError::InvalidId(format!(
"{}, {}",
self.parent().id(),
self.id()
)))?
})
}
}