Refactored ArrayGet instruction and added documentation for the instruction.
This commit is contained in:
parent
7ff6dda8e0
commit
c01ad0d6d9
2 changed files with 58 additions and 8 deletions
39
docs/array_get.md
Normal file
39
docs/array_get.md
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# array_get
|
||||||
|
|
||||||
|
Get an item from an array using "dot" notation.
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
* array (`array`, `instruction`) - The array to get the value from.
|
||||||
|
* key (`string`, `instruction`) - The key to get the value for.
|
||||||
|
|
||||||
|
## Return
|
||||||
|
|
||||||
|
(mixed) - The value of the key or throws an exception if the key is not found.
|
||||||
|
|
||||||
|
## Exceptions
|
||||||
|
|
||||||
|
* `EvaluationException` - If there was an error while evaluating one or more parameters.
|
||||||
|
* `KeyException` - If the key is not found.
|
||||||
|
* `TypeException` - If one or more parameters are not of the expected type.
|
||||||
|
|
||||||
|
## Instruction Example
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "array_get",
|
||||||
|
"_": {
|
||||||
|
"array": {
|
||||||
|
"foo": {
|
||||||
|
"bar": "baz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"key": "foo.bar"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Last Updated
|
||||||
|
|
||||||
|
Monday, December 26th, 2022.
|
||||||
|
Written by [Netkas](https://git.n64.cc/netkas)
|
|
@ -11,6 +11,7 @@
|
||||||
use RTEX\Exceptions\EvaluationException;
|
use RTEX\Exceptions\EvaluationException;
|
||||||
use RTEX\Exceptions\InstructionException;
|
use RTEX\Exceptions\InstructionException;
|
||||||
use RTEX\Exceptions\Runtime\KeyException;
|
use RTEX\Exceptions\Runtime\KeyException;
|
||||||
|
use RTEX\Exceptions\Runtime\TypeException;
|
||||||
use RTEX\Interfaces\InstructionInterface;
|
use RTEX\Interfaces\InstructionInterface;
|
||||||
|
|
||||||
class ArrayGet implements InstructionInterface
|
class ArrayGet implements InstructionInterface
|
||||||
|
@ -111,23 +112,33 @@
|
||||||
* @return mixed
|
* @return mixed
|
||||||
* @throws EvaluationException
|
* @throws EvaluationException
|
||||||
* @throws KeyException
|
* @throws KeyException
|
||||||
|
* @throws TypeException
|
||||||
*/
|
*/
|
||||||
public function eval(Engine $engine): mixed
|
public function eval(Engine $engine): mixed
|
||||||
{
|
{
|
||||||
$queryParts = explode('.', $engine->eval($this->Value));
|
$value = $engine->eval($this->Value);
|
||||||
$value = $engine->getEnvironment()->getRuntimeVariable($engine->eval($this->Array));
|
$array = $engine->eval($this->Array);
|
||||||
|
|
||||||
foreach ($queryParts as $queryPart)
|
if (!is_array($array))
|
||||||
|
throw new KeyException(sprintf('Cannot read from non-array value of type %s', Utilities::getType($array)));
|
||||||
|
if(!is_string($value) && !is_int($value))
|
||||||
|
throw new TypeException(sprintf('Cannot read from array with non-string value %s', Utilities::getType($value)));
|
||||||
|
|
||||||
|
$keys = explode('.', $value);
|
||||||
|
$result = $array;
|
||||||
|
foreach ($keys as $key)
|
||||||
{
|
{
|
||||||
if (is_array($value) && array_key_exists($queryPart, $value))
|
if (is_array($result) && array_key_exists($key, $result))
|
||||||
{
|
{
|
||||||
return $value[$queryPart];
|
$result = $result[$key];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new KeyException(sprintf('Key "%s" does not exist in array (%s)', $key, $value));
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new KeyException(sprintf('Key "%s" does not exist in array', $queryPart));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $value;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Reference in a new issue