tablo_test/protocol/
wizard.rs1use super::dom::{attr_value, strip_text, tags_where};
6
7#[derive(Debug, Clone, PartialEq, Eq)]
9pub struct WizardStep {
10 pub label: String,
12 pub current: bool,
14 pub errored: bool,
16 pub keys: Vec<String>,
18}
19
20pub fn wizard_steps(html: &str) -> Vec<WizardStep> {
22 tags_where(html, |tag, attrs| {
23 tag == "button" && attrs.iter().any(|(name, _)| name == "data-wizard-trigger")
24 })
25 .into_iter()
26 .map(|(_, attrs, inner)| {
27 let panel = attr_value(&attrs, "aria-controls").and_then(|id| {
28 tags_where(html, |_, attrs| {
29 attr_value(attrs, "id").as_deref() == Some(id.as_str())
30 })
31 .into_iter()
32 .next()
33 });
34 let shown = panel
35 .as_ref()
36 .is_some_and(|(_, attrs, _)| !attrs.iter().any(|(name, _)| name == "hidden"));
37 let mut keys: Vec<String> = Vec::new();
38 if let Some((_, _, panel)) = &panel {
39 for (_, attrs, _) in tags_where(panel, |_, attrs| attr_value(attrs, "name").is_some()) {
40 let key = attr_value(&attrs, "name").unwrap_or_default();
41 if !keys.contains(&key) {
42 keys.push(key);
43 }
44 }
45 }
46 WizardStep {
47 label: strip_text(&inner),
48 current: shown && attr_value(&attrs, "aria-current").as_deref() == Some("step"),
49 errored: attrs.iter().any(|(name, _)| name == "data-wizard-error"),
50 keys,
51 }
52 })
53 .collect()
54}