<?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; 
 
use Chevere\DataStructure\Interfaces\VectorInterface; 
use Chevere\DataStructure\Vector; 
use Chevere\Parameter\Interfaces\TypeInterface; 
use Chevere\VarDump\Interfaces\FormatInterface; 
use Chevere\VarDump\Interfaces\ObjectIdsInterface; 
use Chevere\VarDump\Interfaces\ProcessorInterface; 
use Chevere\VarDump\Interfaces\VarDumpableInterface; 
use Chevere\VarDump\Interfaces\VarDumperInterface; 
use Chevere\Writer\Interfaces\WriterInterface; 
 
final class VarDumper implements VarDumperInterface 
{ 
    /** 
     * @var VectorInterface<int> 
     */ 
    public VectorInterface $knownObjectsId; 
 
    private int $indent = 0; 
 
    private string $indentString = ''; 
 
    private int $depth = 0; 
 
    public function __construct( 
        private WriterInterface $writer, 
        private FormatInterface $format, 
        private VarDumpableInterface $dumpable, 
        private ObjectIdsInterface $objectReferences, 
    ) { 
        $this->knownObjectsId = new Vector(); 
    } 
 
    public function objectReferences(): ObjectIdsInterface 
    { 
        return $this->objectReferences; 
    } 
 
    public function writer(): WriterInterface 
    { 
        return $this->writer; 
    } 
 
    public function format(): FormatInterface 
    { 
        return $this->format; 
    } 
 
    public function dumpable(): VarDumpableInterface 
    { 
        return $this->dumpable; 
    } 
 
    public function withIndent(int $indent): VarDumperInterface 
    { 
        $new = clone $this; 
        $new->indent = $indent; 
        $new->indentString = $new->format->indent($indent); 
 
        return $new; 
    } 
 
    public function indent(): int 
    { 
        return $this->indent; 
    } 
 
    public function indentString(): string 
    { 
        return $this->indentString; 
    } 
 
    public function withDepth(int $depth): VarDumperInterface 
    { 
        $new = clone $this; 
        $new->depth = $depth; 
 
        return $new; 
    } 
 
    public function depth(): int 
    { 
        return $this->depth; 
    } 
 
    public function withProcess(): VarDumperInterface 
    { 
        $new = clone $this; 
        $processorName = $new->dumpable->processorName(); 
        if (in_array($new->dumpable->type(), [TypeInterface::ARRAY, TypeInterface::OBJECT], true)) { 
            ++$new->indent; 
        } 
        /** @var ProcessorInterface $processor */ 
        $processor = new $processorName($new); 
        $processor->write(); 
 
        return $new; 
    } 
} 
 
 |