diff options
Diffstat (limited to 'vendor/mtdowling/jmespath.php/src/AstRuntime.php')
-rw-r--r-- | vendor/mtdowling/jmespath.php/src/AstRuntime.php | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/vendor/mtdowling/jmespath.php/src/AstRuntime.php b/vendor/mtdowling/jmespath.php/src/AstRuntime.php new file mode 100644 index 0000000..03f5f1a --- /dev/null +++ b/vendor/mtdowling/jmespath.php/src/AstRuntime.php @@ -0,0 +1,47 @@ +<?php +namespace JmesPath; + +/** + * Uses an external tree visitor to interpret an AST. + */ +class AstRuntime +{ + private $parser; + private $interpreter; + private $cache = []; + private $cachedCount = 0; + + public function __construct( + Parser $parser = null, + callable $fnDispatcher = null + ) { + $fnDispatcher = $fnDispatcher ?: FnDispatcher::getInstance(); + $this->interpreter = new TreeInterpreter($fnDispatcher); + $this->parser = $parser ?: new Parser(); + } + + /** + * Returns data from the provided input that matches a given JMESPath + * expression. + * + * @param string $expression JMESPath expression to evaluate + * @param mixed $data Data to search. This data should be data that + * is similar to data returned from json_decode + * using associative arrays rather than objects. + * + * @return mixed Returns the matching data or null + */ + public function __invoke($expression, $data) + { + if (!isset($this->cache[$expression])) { + // Clear the AST cache when it hits 1024 entries + if (++$this->cachedCount > 1024) { + $this->cache = []; + $this->cachedCount = 0; + } + $this->cache[$expression] = $this->parser->parse($expression); + } + + return $this->interpreter->visit($this->cache[$expression], $data); + } +} |