use crate::value::Value;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Selector {
Key(String),
Index(usize),
}
impl Selector {
#[must_use]
pub fn as_key(&self) -> Option<&str> {
match self {
Selector::Key(k) => Some(k),
Selector::Index(_) => None,
}
}
#[must_use]
pub fn as_index(&self) -> Option<usize> {
match self {
Selector::Index(i) => Some(*i),
Selector::Key(_) => None,
}
}
}
pub type Predicate = Box<dyn Fn(&Value, &Selector) -> bool>;
pub enum Accessor {
Key(String),
Index(usize),
Predicate(Predicate),
}
impl Accessor {
#[must_use]
pub fn key(k: impl Into<String>) -> Accessor {
Accessor::Key(k.into())
}
#[must_use]
pub fn index(i: usize) -> Accessor {
Accessor::Index(i)
}
#[must_use]
pub fn predicate<F>(f: F) -> Accessor
where
F: Fn(&Value, &Selector) -> bool + 'static,
{
Accessor::Predicate(Box::new(f))
}
}
impl std::fmt::Debug for Accessor {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Accessor::Key(k) => write!(f, "Key({k:?})"),
Accessor::Index(i) => write!(f, "Index({i})"),
Accessor::Predicate(_) => write!(f, "Predicate(..)"),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub(crate) enum Step {
Key(String),
Index(usize),
}