jsonpath_lib2 0.3.3

An updated fork of jsonpath_lib. The original crate has not been updated since 2021 Jun 03. It is JsonPath engine written in Rust. It provide a similar API interface in Webassembly and Javascript too. - Webassembly Demo: https://freestrings.github.io/jsonpath Feel free to transfer maintenance for this crate if I don't respond for one year. I consent to the transfer of this crate to the first person who asks help@crates.io for it.
Documentation
use crate::paths::path_parser::ParserNode;
use crate::paths::tokens::{FilterToken, ParseToken};
use crate::paths::{ParserTokenHandler, StrRange};
use crate::trace;

pub trait ParserNodeVisitor<'a> {
    fn visit<F, F1>(&self, parse_node: &ParserNode, token_handler: &mut F, parse_value_reader: &F1)
    where
        F: ParserTokenHandler<'a>,
        F1: Fn(&StrRange) -> &'a str,
    {
        trace!("visit {:?}", parse_node);
        match &parse_node.token {
            ParseToken::Absolute
            | ParseToken::Relative
            | ParseToken::All
            | ParseToken::Key(_)
            | ParseToken::Keys(_)
            | ParseToken::Range(_, _, _)
            | ParseToken::Union(_)
            | ParseToken::Number(_)
            | ParseToken::Bool(_) => {
                token_handler.handle(&parse_node.token, parse_value_reader);
            }
            ParseToken::In | ParseToken::Leaves => {
                if let Some(n) = &parse_node.left {
                    self.visit(n, token_handler, parse_value_reader);
                }

                token_handler.handle(&parse_node.token, parse_value_reader);

                if let Some(n) = &parse_node.right {
                    self.visit(n, token_handler, parse_value_reader);
                }
            }
            ParseToken::Array => {
                if let Some(n) = &parse_node.left {
                    self.visit(n, token_handler, parse_value_reader);
                }

                token_handler.handle(&parse_node.token, parse_value_reader);

                if let Some(n) = &parse_node.right {
                    self.visit(n, token_handler, parse_value_reader);
                }

                token_handler.handle(&ParseToken::ArrayEof, parse_value_reader);
            }
            ParseToken::Filter(FilterToken::And) | ParseToken::Filter(FilterToken::Or) => {
                if let Some(n) = &parse_node.left {
                    self.visit(n, token_handler, parse_value_reader);
                }

                if let Some(n) = &parse_node.right {
                    self.visit(n, token_handler, parse_value_reader);
                }

                token_handler.handle(&parse_node.token, parse_value_reader);
            }
            ParseToken::Filter(_) => {
                if let Some(n) = &parse_node.left {
                    self.visit(n, token_handler, parse_value_reader);
                }

                if let Some(n) = &parse_node.right {
                    self.visit(n, token_handler, parse_value_reader);
                }

                token_handler.handle(&parse_node.token, parse_value_reader);
            }
            _ => {}
        }
    }
}