Passed
Push — master ( 308d02...325a65 )
by Christian
02:19
created

OptionDescriber::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace Cocotte\Console\Documentation;
4
5
use Cocotte\Console\StyledInputOption;
6
use Symfony\Component\Console\Formatter\OutputFormatter;
7
use Symfony\Component\Console\Input\InputOption;
8
9
final class OptionDescriber
10
{
11
12
    public function describe(InputOption $option)
13
    {
14
        $name = '--'.$option->getName();
15
        if ($option->getShortcut()) {
16
            $name .= '|-'.implode('|-', explode('|', $option->getShortcut())).'';
17
        }
18
19
        $emphasis = $this->optionEmphasis($option);
20
21
        $description = $this->removeDecoration($option->getDescription());
22
23
        return
24
            '#### `'.$name.'`'."\n\n"
25
            .$this->formatOptionDescription($description, $emphasis)
26
            .'* Accept value: '.$this->optionValue($option)."\n"
27
            .'* Is value required: '.$this->optionValueRequired($option)."\n"
28
            .'* Is multiple: '.$this->optionIsMultiple($option)."\n"
29
            .'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`';
30
    }
31
32
    /**
33
     * @param InputOption $option
34
     * @return string
35
     */
36
    private function optionValue(InputOption $option): string
37
    {
38
        return ($option->acceptValue() ? 'yes' : 'no');
39
    }
40
41
    /**
42
     * @param InputOption $option
43
     * @return string
44
     */
45
    private function optionValueRequired(InputOption $option): string
46
    {
47
        return ($option->isValueRequired() ? 'yes' : 'no');
48
    }
49
50
    /**
51
     * @param InputOption $option
52
     * @return string
53
     */
54
    private function optionIsMultiple(InputOption $option): string
55
    {
56
        return ($option->isArray() ? 'yes' : 'no');
57
    }
58
59
    /**
60
     * @param InputOption $option
61
     * @return string
62
     */
63
    private function optionEmphasis(InputOption $option): string
64
    {
65
        return $option instanceof StyledInputOption ? '##### ' : '';
66
    }
67
68
    private function removeDecoration(string $string): string
69
    {
70
        $f = new OutputFormatter();
71
72
        return $f->format($string);
73
    }
74
75
    /**
76
     * @param $description
77
     * @param $emphasis
78
     * @return string
79
     */
80
    private function formatOptionDescription($description, $emphasis): string
81
    {
82
        return ($description ? $emphasis.preg_replace('/\s*[\r\n]\s*/', "\n", $description)."\n\n" : '');
83
    }
84
85
}