<?php 
 
/* 
 * This file is part of Chevere. 
 * 
 * (c) Rodolfo Berrios <[email protected]> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
declare(strict_types=1); 
 
namespace Chevere\VarDump\Processors; 
 
use Chevere\Parameter\Interfaces\TypeInterface; 
use Chevere\VarDump\Interfaces\ProcessorInterface; 
use Chevere\VarDump\Interfaces\ProcessorNestedInterface; 
use Chevere\VarDump\Interfaces\VarDumperInterface; 
use Chevere\VarDump\Processors\Traits\HandleDepthTrait; 
use Chevere\VarDump\Processors\Traits\ProcessorTrait; 
 
final class ArrayProcessor implements ProcessorInterface, ProcessorNestedInterface 
{ 
    use ProcessorTrait; 
    use HandleDepthTrait; 
 
    /** 
     * @var array<mixed> 
     */ 
    private array $var; 
 
    private int $count = 0; 
 
    public function __construct( 
        private VarDumperInterface $varDumper 
    ) { 
        $this->assertType(); 
        /** @var array<mixed> $array */ 
        $array = $this->varDumper->dumpable()->var(); 
        $this->var = $array; 
        $this->depth = $this->varDumper->depth() + 1; 
        $this->count = count($this->var); 
        $this->info = 'size=' . $this->count; 
    } 
 
    public function type(): string 
    { 
        return TypeInterface::ARRAY; 
    } 
 
    public function write(): void 
    { 
        $this->varDumper->writer()->write( 
            $this->typeHighlighted() 
            . ' ' 
            . ($this->count === 0 ? '[] ' : '') 
            . $this->highlightParentheses($this->info) 
        ); 
        if ($this->isCircularRef($this->var)) { 
            $this->varDumper->writer()->write( 
                ' ' 
                . $this->highlightParentheses($this->circularReference()) 
            ); 
 
            return; 
        } 
        if ($this->depth > self::MAX_DEPTH) { 
            $this->varDumper->writer()->write( 
                ' ' 
                . $this->highlightParentheses($this->maxDepthReached()) 
            ); 
 
            return; 
        } 
        $this->processMembers(); 
    } 
 
    /** 
     * @param array<mixed> $array 
     */ 
    private function isCircularRef(array $array): bool 
    { 
        foreach ($array as $var) { 
            if ($array === $var) { 
                return true; 
            } 
            if (is_array($var)) { 
                return $this->isCircularRef($var); 
            } 
        } 
 
        return false; 
    } 
 
    private function processMembers(): void 
    { 
        $aux = 0; 
        $operator = $this->highlightOperator('=>'); 
        foreach ($this->var as $key => $value) { 
            $aux++; 
            if ($aux === 1) { 
                $this->varDumper->writer()->write( 
                    $this->varDumper->format()->detailsOpen( 
                        $this->varDumper->depth() === 0 
                    ) 
                ); 
                if ($this->varDumper->format()->detailsClose() === '') { 
                    $this->varDumper->writer()->write("\n"); 
                } 
            } else { 
                $this->varDumper->writer()->write("\n"); 
            } 
 
            $indentString = $this->varDumper->indentString(); 
            $format = $this->varDumper->format()->filterEncodedChars((string) $key); 
            $this->varDumper->writer()->write(" {$indentString}{$format} {$operator} "); 
            $this->handleDepth($value); 
        } 
        if ($aux > 0) { 
            $this->varDumper->writer()->write( 
                $this->varDumper->format()->detailsClose() 
            ); 
        } 
    } 
} 
 
 |