use super::dom::{attr_value, open_tags};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CreateOptionLink {
pub select: String,
pub href: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Picked {
Option {
value: String,
label: String,
},
Unchoosable,
}
pub fn create_option_links(html: &str) -> Vec<CreateOptionLink> {
let tags = open_tags(html);
tags.iter()
.filter(|(tag, _, _)| tag == "a")
.filter_map(|(_, attrs, _)| {
let dialog = attr_value(attrs, "data-create-option")?;
let select = tags.iter().find_map(|(tag, attrs, _)| {
(tag == "dialog" && attr_value(attrs, "id").as_deref() == Some(dialog.as_str()))
.then(|| attr_value(attrs, "data-create-option-select"))
.flatten()
})?;
Some(CreateOptionLink {
select,
href: attr_value(attrs, "href")?,
})
})
.collect()
}
pub fn picked(html: &str) -> Option<Picked> {
open_tags(html).into_iter().find_map(|(_, attrs, _)| {
if attr_value(&attrs, "data-picked-hidden").is_some() {
return Some(Picked::Unchoosable);
}
attr_value(&attrs, "data-picked")?;
Some(Picked::Option {
value: attr_value(&attrs, "data-picked-value")?,
label: attr_value(&attrs, "data-picked-label")?,
})
})
}
pub fn posts_picking(html: &str) -> bool {
open_tags(html).iter().any(|(tag, attrs, _)| {
tag == "form"
&& attr_value(attrs, "data-form-guard").is_some()
&& attr_value(attrs, "action").is_some_and(|action| {
action
.split_once('?')
.is_some_and(|(_, query)| query.split('&').any(|pair| pair == "pick=1"))
})
})
}