use std::collections::BTreeMap;
use pest::iterators::Pairs;
use scraper::{Html, Selector};
use super::Rule;
use crate::errors::{ParseError, ParserResult};
#[must_use]
pub fn get_tag_open<'b>(pair_children: &'b Pairs<'_, Rule>) -> &'b str {
let pair = pair_children
.clone()
.next()
.expect("assertion fails, snippet without tag open");
assert!(
pair.as_rule() == Rule::tag_open,
"Expected tag_open rule, found {:?}",
pair.as_rule()
);
pair.into_inner()
.nth(1)
.expect("Expected at least two")
.as_str()
}
#[must_use]
pub fn get_tag_close(pair_children: Pairs<'_, Rule>) -> &'_ str {
for x in pair_children {
match x.as_rule() {
Rule::tag_close => {
return x.as_str();
}
_ => continue,
}
}
panic!("tag close not found")
}
pub fn get_tag_attributes(tag: &str) -> ParserResult<'_, BTreeMap<String, String>> {
let html = Html::parse_fragment(tag);
let selector_name = "snip";
let selector = Selector::parse(selector_name)?;
let attributes = html
.select(&selector)
.next()
.ok_or_else(|| ParseError::SelectorNotFound {
selector: selector_name.to_string(),
tag: tag.to_string(),
})?
.value()
.attrs();
Ok(attributes
.map(|(key, value)| (key.to_string(), value.to_string()))
.collect())
}
#[must_use]
pub fn get_comment_tag_open<'b>(pair_children: &'b Pairs<'_, Rule>) -> &'b str {
let pair = pair_children
.clone()
.next()
.expect("assertion fails, snippet without tag open");
assert!(
pair.as_rule() == Rule::tag_open,
"Expected tag_open rule, found {:?}",
pair.as_rule()
);
pair.into_inner()
.next()
.expect("Expected at least two")
.as_str()
}
#[must_use]
pub fn get_comment_tag_of_tag_open<'b>(pair_children: &'b Pairs<'_, Rule>) -> Option<&'b str> {
let pair = pair_children
.clone()
.next()
.expect("assertion fails, snippet without tag open");
assert!(
pair.as_rule() == Rule::tag_open,
"Expected tag_open rule, found {:?}",
pair.as_rule()
);
pair.into_inner().nth(2).map(|p| p.as_str())
}