blob: 7d9ec0e7ee61447e8a920d6a047d943637f03825 [file] [log] [blame]
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +02001<?php
2
3/*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Symfony\Component\VarDumper\Command\Descriptor;
13
14use Symfony\Component\Console\Formatter\OutputFormatterStyle;
15use Symfony\Component\Console\Input\ArrayInput;
16use Symfony\Component\Console\Output\OutputInterface;
17use Symfony\Component\Console\Style\SymfonyStyle;
18use Symfony\Component\VarDumper\Cloner\Data;
19use Symfony\Component\VarDumper\Dumper\CliDumper;
20
21/**
22 * Describe collected data clones for cli output.
23 *
24 * @author Maxime Steinhausser <maxime.steinhausser@gmail.com>
25 *
26 * @final
27 */
28class CliDescriptor implements DumpDescriptorInterface
29{
30 private $dumper;
31 private $lastIdentifier;
32 private $supportsHref;
33
34 public function __construct(CliDumper $dumper)
35 {
36 $this->dumper = $dumper;
37 $this->supportsHref = method_exists(OutputFormatterStyle::class, 'setHref');
38 }
39
40 public function describe(OutputInterface $output, Data $data, array $context, int $clientId): void
41 {
42 $io = $output instanceof SymfonyStyle ? $output : new SymfonyStyle(new ArrayInput([]), $output);
43 $this->dumper->setColors($output->isDecorated());
44
45 $rows = [['date', date('r', (int) $context['timestamp'])]];
46 $lastIdentifier = $this->lastIdentifier;
47 $this->lastIdentifier = $clientId;
48
49 $section = "Received from client #$clientId";
50 if (isset($context['request'])) {
51 $request = $context['request'];
52 $this->lastIdentifier = $request['identifier'];
53 $section = sprintf('%s %s', $request['method'], $request['uri']);
54 if ($controller = $request['controller']) {
55 $rows[] = ['controller', rtrim($this->dumper->dump($controller, true), "\n")];
56 }
57 } elseif (isset($context['cli'])) {
58 $this->lastIdentifier = $context['cli']['identifier'];
59 $section = '$ '.$context['cli']['command_line'];
60 }
61
62 if ($this->lastIdentifier !== $lastIdentifier) {
63 $io->section($section);
64 }
65
66 if (isset($context['source'])) {
67 $source = $context['source'];
68 $sourceInfo = sprintf('%s on line %d', $source['name'], $source['line']);
69 $fileLink = $source['file_link'] ?? null;
70 if ($this->supportsHref && $fileLink) {
71 $sourceInfo = sprintf('<href=%s>%s</>', $fileLink, $sourceInfo);
72 }
73 $rows[] = ['source', $sourceInfo];
74 $file = $source['file_relative'] ?? $source['file'];
75 $rows[] = ['file', $file];
76 }
77
78 $io->table([], $rows);
79
80 if (!$this->supportsHref && isset($fileLink)) {
81 $io->writeln(['<info>Open source in your IDE/browser:</info>', $fileLink]);
82 $io->newLine();
83 }
84
85 $this->dumper->dump($data);
86 $io->newLine();
87 }
88}