use super::{CssSelectorSet, SelectorSet};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SelectorCtx {
s: CssSelectorSet,
backref: CssSelectorSet,
}
impl SelectorCtx {
pub fn root() -> Self {
Self {
s: CssSelectorSet::root(),
backref: CssSelectorSet::root(),
}
}
pub fn is_root(&self) -> bool {
self.s.is_root()
}
pub fn real(&self) -> CssSelectorSet {
self.s.clone()
}
pub(crate) fn nest(&self, selectors: SelectorSet) -> CssSelectorSet {
self.s.nest(selectors, self.get_backref())
}
pub(crate) fn at_root(&self, selectors: SelectorSet) -> Self {
let backref = self.get_backref();
Self {
s: CssSelectorSet {
s: selectors.resolve_ref(backref),
},
backref: backref.clone(),
}
}
pub(crate) fn get_backref(&self) -> &CssSelectorSet {
if self.s.is_root() {
&self.backref
} else {
&self.s
}
}
}
impl From<CssSelectorSet> for SelectorCtx {
fn from(value: CssSelectorSet) -> Self {
Self {
s: value,
backref: CssSelectorSet::root(),
}
}
}