use crate::{num::JsonInt, str::JsonString, Index, JsonPathQuery, Segment, Selector, Selectors, SliceBuilder};
pub struct JsonPathQueryBuilder {
segments: Vec<Segment>,
}
pub struct JsonPathSelectorsBuilder {
selectors: Vec<Selector>,
}
impl JsonPathQueryBuilder {
#[must_use]
#[inline(always)]
pub fn new() -> Self {
Self { segments: vec![] }
}
#[inline]
pub fn child<F>(&mut self, selectors_builder: F) -> &mut Self
where
F: FnOnce(&mut JsonPathSelectorsBuilder) -> &mut JsonPathSelectorsBuilder,
{
let mut builder = JsonPathSelectorsBuilder::new();
selectors_builder(&mut builder);
self.segments.push(Segment::Child(builder.build()));
self
}
#[inline]
pub fn descendant<F>(&mut self, selectors_builder: F) -> &mut Self
where
F: FnOnce(&mut JsonPathSelectorsBuilder) -> &mut JsonPathSelectorsBuilder,
{
let mut builder = JsonPathSelectorsBuilder::new();
selectors_builder(&mut builder);
self.segments.push(Segment::Descendant(builder.build()));
self
}
#[inline(always)]
pub fn child_name<S: Into<JsonString>>(&mut self, name: S) -> &mut Self {
self.child(|x| x.name(name))
}
#[inline(always)]
pub fn child_wildcard(&mut self) -> &mut Self {
self.child(|x| x.wildcard())
}
#[inline(always)]
pub fn child_index<N: Into<JsonInt>>(&mut self, idx: N) -> &mut Self {
self.child(|x| x.index(idx))
}
#[inline(always)]
pub fn child_slice<F>(&mut self, slice_builder: F) -> &mut Self
where
F: FnOnce(&mut SliceBuilder) -> &mut SliceBuilder,
{
self.child(|x| x.slice(slice_builder))
}
#[inline(always)]
pub fn descendant_name<S: Into<JsonString>>(&mut self, name: S) -> &mut Self {
self.descendant(|x| x.name(name))
}
#[inline(always)]
pub fn descendant_wildcard(&mut self) -> &mut Self {
self.descendant(|x| x.wildcard())
}
#[inline(always)]
pub fn descendant_index<N: Into<JsonInt>>(&mut self, idx: N) -> &mut Self {
self.descendant(|x| x.index(idx))
}
#[inline(always)]
pub fn descendant_slice<F>(&mut self, slice_builder: F) -> &mut Self
where
F: FnOnce(&mut SliceBuilder) -> &mut SliceBuilder,
{
self.descendant(|x| x.slice(slice_builder))
}
#[must_use]
#[inline]
pub fn to_query(&mut self) -> JsonPathQuery {
JsonPathQuery {
segments: self.segments.clone(),
}
}
#[must_use]
#[inline]
pub fn into_query(self) -> JsonPathQuery {
JsonPathQuery {
segments: self.segments,
}
}
}
impl JsonPathSelectorsBuilder {
fn new() -> Self {
Self { selectors: vec![] }
}
fn build(self) -> Selectors {
Selectors::many(self.selectors)
}
#[inline(always)]
pub fn name<S: Into<JsonString>>(&mut self, name: S) -> &mut Self {
self.selectors.push(Selector::Name(name.into()));
self
}
#[inline(always)]
pub fn index<N: Into<JsonInt>>(&mut self, idx: N) -> &mut Self {
let json_int: JsonInt = idx.into();
self.selectors.push(Selector::Index(Index::from(json_int)));
self
}
#[inline(always)]
pub fn slice<F>(&mut self, slice_builder: F) -> &mut Self
where
F: FnOnce(&mut SliceBuilder) -> &mut SliceBuilder,
{
let mut slice = SliceBuilder::new();
slice_builder(&mut slice);
let slice = slice.into();
self.selectors.push(Selector::Slice(slice));
self
}
#[inline(always)]
pub fn wildcard(&mut self) -> &mut Self {
self.selectors.push(Selector::Wildcard);
self
}
}
impl Default for JsonPathQueryBuilder {
#[inline(always)]
fn default() -> Self {
Self::new()
}
}
impl From<JsonPathQueryBuilder> for JsonPathQuery {
#[inline(always)]
fn from(value: JsonPathQueryBuilder) -> Self {
Self {
segments: value.segments,
}
}
}