| 
<?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;
 }
 }
 
 |