/**
* @inheritdoc
*/
public function process(ParserInterface $parser, string $file, array $data) : array
{
if (false === array_key_exists('include', $data)) {
throw InvalidArgumentExceptionFactory::createForNoIncludeStatementInData($file);
}
$include = $data['include'];
unset($data['include']);
if (null === $include) {
return $data;
}
if (false === is_array($include)) {
throw TypeErrorFactory::createForInvalidIncludeStatementInData($include, $file);
}
foreach ($include as $includeFile) {
if (false === is_string($includeFile)) {
throw TypeErrorFactory::createForInvalidIncludedFilesInData($includeFile, $file);
}
if (0 === strlen($includeFile)) {
throw InvalidArgumentExceptionFactory::createForEmptyIncludedFileInData($file);
}
$filePathToInclude = $this->fileLocator->locate($includeFile, dirname($file));
$fileToIncludeData = $parser->parse($filePathToInclude);
if (array_key_exists('include', $fileToIncludeData)) {
$fileToIncludeData = $this->process($parser, $file, $fileToIncludeData);
}
$data = $this->dataMerger->mergeInclude($data, $fileToIncludeData);
}
return $data;
}