use fhp_core::tag::Tag;
#[derive(Debug, Clone)]
pub struct SelectorList {
pub selectors: Vec<Selector>,
}
#[derive(Debug, Clone)]
pub struct Selector {
pub subject: CompoundSelector,
pub chain: Vec<(Combinator, CompoundSelector)>,
}
#[derive(Debug, Clone)]
pub struct CompoundSelector {
pub parts: Vec<SimpleSelector>,
}
#[derive(Debug, Clone)]
pub enum SimpleSelector {
Tag(Tag),
UnknownTag(String),
Class(String, u64),
Id(String, u32),
Universal,
Attr(AttrSelector),
PseudoFirstChild,
PseudoLastChild,
PseudoNthChild {
a: i32,
b: i32,
},
PseudoNot(Box<CompoundSelector>),
}
#[derive(Debug, Clone)]
pub struct AttrSelector {
pub name: String,
pub op: AttrOp,
pub value: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AttrOp {
Exists,
Equals,
Includes,
StartsWith,
EndsWith,
Substring,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Combinator {
Descendant,
Child,
AdjacentSibling,
GeneralSibling,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn selector_debug() {
let sel = Selector {
subject: CompoundSelector {
parts: vec![SimpleSelector::Tag(Tag::Div)],
},
chain: vec![],
};
let debug = format!("{sel:?}");
assert!(debug.contains("Div"));
}
#[test]
fn attr_op_eq() {
assert_eq!(AttrOp::Exists, AttrOp::Exists);
assert_ne!(AttrOp::Equals, AttrOp::Substring);
}
#[test]
fn combinator_eq() {
assert_eq!(Combinator::Descendant, Combinator::Descendant);
assert_ne!(Combinator::Child, Combinator::Descendant);
}
}