1<?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\Console\Descriptor;
13
14use Symfony\Component\Console\Application;
15use Symfony\Component\Console\Command\Command;
16use Symfony\Component\Console\Exception\InvalidArgumentException;
17use Symfony\Component\Console\Input\InputArgument;
18use Symfony\Component\Console\Input\InputDefinition;
19use Symfony\Component\Console\Input\InputOption;
20use Symfony\Component\Console\Output\OutputInterface;
21
22/**
23 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
24 *
25 * @internal
26 */
27abstract class Descriptor implements DescriptorInterface
28{
29    /**
30     * @var OutputInterface
31     */
32    protected $output;
33
34    /**
35     * {@inheritdoc}
36     */
37    public function describe(OutputInterface $output, $object, array $options = [])
38    {
39        $this->output = $output;
40
41        switch (true) {
42            case $object instanceof InputArgument:
43                $this->describeInputArgument($object, $options);
44                break;
45            case $object instanceof InputOption:
46                $this->describeInputOption($object, $options);
47                break;
48            case $object instanceof InputDefinition:
49                $this->describeInputDefinition($object, $options);
50                break;
51            case $object instanceof Command:
52                $this->describeCommand($object, $options);
53                break;
54            case $object instanceof Application:
55                $this->describeApplication($object, $options);
56                break;
57            default:
58                throw new InvalidArgumentException(sprintf('Object of type "%s" is not describable.', \get_class($object)));
59        }
60    }
61
62    /**
63     * Writes content to output.
64     *
65     * @param string $content
66     * @param bool   $decorated
67     */
68    protected function write($content, $decorated = false)
69    {
70        $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW);
71    }
72
73    /**
74     * Describes an InputArgument instance.
75     */
76    abstract protected function describeInputArgument(InputArgument $argument, array $options = []);
77
78    /**
79     * Describes an InputOption instance.
80     */
81    abstract protected function describeInputOption(InputOption $option, array $options = []);
82
83    /**
84     * Describes an InputDefinition instance.
85     */
86    abstract protected function describeInputDefinition(InputDefinition $definition, array $options = []);
87
88    /**
89     * Describes a Command instance.
90     */
91    abstract protected function describeCommand(Command $command, array $options = []);
92
93    /**
94     * Describes an Application instance.
95     */
96    abstract protected function describeApplication(Application $application, array $options = []);
97}
98