diff options
Diffstat (limited to 'vendor/mtdowling/jmespath.php/src/CompilerRuntime.php')
-rw-r--r-- | vendor/mtdowling/jmespath.php/src/CompilerRuntime.php | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/vendor/mtdowling/jmespath.php/src/CompilerRuntime.php b/vendor/mtdowling/jmespath.php/src/CompilerRuntime.php new file mode 100644 index 0000000..c26b09c --- /dev/null +++ b/vendor/mtdowling/jmespath.php/src/CompilerRuntime.php @@ -0,0 +1,83 @@ +<?php +namespace JmesPath; + +/** + * Compiles JMESPath expressions to PHP source code and executes it. + * + * JMESPath file names are stored in the cache directory using the following + * logic to determine the filename: + * + * 1. Start with the string "jmespath_" + * 2. Append the MD5 checksum of the expression. + * 3. Append ".php" + */ +class CompilerRuntime +{ + private $parser; + private $compiler; + private $cacheDir; + private $interpreter; + + /** + * @param string|null $dir Directory used to store compiled PHP files. + * @param Parser|null $parser JMESPath parser to utilize + * @throws \RuntimeException if the cache directory cannot be created + */ + public function __construct($dir = null, Parser $parser = null) + { + $this->parser = $parser ?: new Parser(); + $this->compiler = new TreeCompiler(); + $dir = $dir ?: sys_get_temp_dir(); + + if (!is_dir($dir) && !mkdir($dir, 0755, true)) { + throw new \RuntimeException("Unable to create cache directory: $dir"); + } + + $this->cacheDir = realpath($dir); + $this->interpreter = new TreeInterpreter(); + } + + /** + * 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 + * @throws \RuntimeException + */ + public function __invoke($expression, $data) + { + $functionName = 'jmespath_' . md5($expression); + + if (!function_exists($functionName)) { + $filename = "{$this->cacheDir}/{$functionName}.php"; + if (!file_exists($filename)) { + $this->compile($filename, $expression, $functionName); + } + require $filename; + } + + return $functionName($this->interpreter, $data); + } + + private function compile($filename, $expression, $functionName) + { + $code = $this->compiler->visit( + $this->parser->parse($expression), + $functionName, + $expression + ); + + if (!file_put_contents($filename, $code)) { + throw new \RuntimeException(sprintf( + 'Unable to write the compiled PHP code to: %s (%s)', + $filename, + var_export(error_get_last(), true) + )); + } + } +} |