| 
<?php
 /**
 * JSONPath implementation for PHP.
 *
 * @license https://github.com/SoftCreatR/JSONPath/blob/main/LICENSE  MIT License
 */
 
 declare(strict_types=1);
 
 namespace Flow\JSONPath;
 
 use function class_exists;
 use function in_array;
 use function ucfirst;
 
 class JSONPathToken
 {
 /*
 * Tokens
 */
 public const T_INDEX = 'index';
 public const T_RECURSIVE = 'recursive';
 public const T_QUERY_RESULT = 'queryResult';
 public const T_QUERY_MATCH = 'queryMatch';
 public const T_SLICE = 'slice';
 public const T_INDEXES = 'indexes';
 
 /**
 * @var string
 */
 public $type;
 
 public $value;
 
 /**
 * @throws JSONPathException
 */
 public function __construct(string $type, $value)
 {
 $this->validateType($type);
 
 $this->type = $type;
 $this->value = $value;
 }
 
 /**
 * @throws JSONPathException
 */
 public function validateType(string $type): void
 {
 if (!in_array($type, static::getTypes(), true)) {
 throw new JSONPathException('Invalid token: ' . $type);
 }
 }
 
 public static function getTypes(): array
 {
 return [
 static::T_INDEX,
 static::T_RECURSIVE,
 static::T_QUERY_RESULT,
 static::T_QUERY_MATCH,
 static::T_SLICE,
 static::T_INDEXES,
 ];
 }
 
 /**
 * @throws JSONPathException
 */
 public function buildFilter(bool $options)
 {
 $filterClass = 'Flow\\JSONPath\\Filters\\' . ucfirst($this->type) . 'Filter';
 
 if (!class_exists($filterClass)) {
 throw new JSONPathException("No filter class exists for token [{$this->type}]");
 }
 
 return new $filterClass($this, $options);
 }
 }
 
 |