From 6f452ea995c25a30f214a530fddc6e9d236bdfce Mon Sep 17 00:00:00 2001 From: Александр Кирюхин Date: Fri, 19 Jan 2018 03:13:16 +0300 Subject: Completed reference implementation, added tests --- src/Compiler/Compiler.php | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/Compiler/Compiler.php (limited to 'src/Compiler/Compiler.php') diff --git a/src/Compiler/Compiler.php b/src/Compiler/Compiler.php new file mode 100644 index 0000000..6a587d2 --- /dev/null +++ b/src/Compiler/Compiler.php @@ -0,0 +1,80 @@ + + * @license: MIT + */ + +namespace NeonXP\Dotenv\Compiler; + +use NeonXP\Dotenv\Exception\RuntimeException; +use NeonXP\Dotenv\Types\KeyValue; + +/** + * Class Compiler + * @package NeonXP\Dotenv\Compiler + */ +class Compiler implements CompilerInterface +{ + const REGEX_VARIABLE = '/\$\{(.+?)\}/'; + + /** + * @var KeyValue[] + */ + protected $collection = []; + + /** + * @var KeyValue[] + */ + protected $cache = []; + + /** + * @inheritdoc + * @param KeyValue[] $collection + */ + public function setRawCollection(array $collection): void + { + $this->collection = []; + $this->cache = []; + foreach ($collection as $keyValue) { + $this->collection[$keyValue->getKey()] = $keyValue; + } + } + + /** + * @inheritdoc + * @param KeyValue $keyValue + * @return KeyValue + */ + public function compileKeyValue(KeyValue $keyValue): KeyValue + { + $newValue = preg_replace_callback(self::REGEX_VARIABLE, function ($variable) use ($keyValue) { + $variable = $variable[1]; + if ($variable === $keyValue->getKey()) { + throw new RuntimeException('Self referencing'); + } + if (isset($this->cache[$variable])) { + return $this->cache[$variable]->getValue(); + } elseif (isset($this->collection[$variable]) && !$this->needToCompile($this->collection[$variable])) { + return $this->collection[$variable]->getValue(); + } elseif (isset($this->collection[$variable]) && $this->needToCompile($this->collection[$variable])) { + return $this->compileKeyValue($this->collection[$variable])->getValue(); + } + return "UNKNOWN VARIABLE {$variable}"; + }, $keyValue->getValue()); + $result = new KeyValue($keyValue->getKey(), $newValue); + $this->cache[$result->getKey()] = $result; + + return $result; + } + + /** + * @param KeyValue $keyValue + * @return bool + */ + protected function needToCompile(KeyValue $keyValue): bool + { + return !!preg_match(self::REGEX_VARIABLE, $keyValue->getValue()); + } +} \ No newline at end of file -- cgit v1.2.3