Chris@0
|
1 <?php
|
Chris@0
|
2 namespace Consolidation\OutputFormatters\Formatters;
|
Chris@0
|
3
|
Chris@17
|
4 use Consolidation\OutputFormatters\Options\FormatterOptions;
|
Chris@17
|
5 use Consolidation\OutputFormatters\Options\OverrideOptionsInterface;
|
Chris@17
|
6 use Consolidation\OutputFormatters\StructuredData\RestructureInterface;
|
Chris@17
|
7 use Consolidation\OutputFormatters\StructuredData\UnstructuredInterface;
|
Chris@17
|
8 use Consolidation\OutputFormatters\Transformations\SimplifiedFormatterInterface;
|
Chris@17
|
9 use Consolidation\OutputFormatters\Transformations\StringTransformationInterface;
|
Chris@0
|
10 use Consolidation\OutputFormatters\Validate\ValidationInterface;
|
Chris@0
|
11 use Consolidation\OutputFormatters\Validate\ValidDataTypesTrait;
|
Chris@0
|
12 use Symfony\Component\Console\Output\OutputInterface;
|
Chris@0
|
13
|
Chris@0
|
14 /**
|
Chris@0
|
15 * String formatter
|
Chris@0
|
16 *
|
Chris@0
|
17 * This formatter is used as the default action when no
|
Chris@0
|
18 * particular formatter is requested. It will print the
|
Chris@0
|
19 * provided data only if it is a string; if any other
|
Chris@0
|
20 * type is given, then nothing is printed.
|
Chris@0
|
21 */
|
Chris@0
|
22 class StringFormatter implements FormatterInterface, ValidationInterface, OverrideOptionsInterface
|
Chris@0
|
23 {
|
Chris@0
|
24 /**
|
Chris@17
|
25 * By default, we assume that we can convert any data type to `string`,
|
Chris@17
|
26 * unless it implements UnstructuredInterface, in which case we won't
|
Chris@17
|
27 * allow the `string` format unless the data type also implements
|
Chris@17
|
28 * StringTransformationInterface.
|
Chris@0
|
29 */
|
Chris@0
|
30 public function isValidDataType(\ReflectionClass $dataType)
|
Chris@0
|
31 {
|
Chris@17
|
32 if ($dataType->implementsInterface('\Consolidation\OutputFormatters\StructuredData\UnstructuredInterface') && !$dataType->implementsInterface('\Consolidation\OutputFormatters\Transformations\StringTransformationInterface')) {
|
Chris@17
|
33 return false;
|
Chris@17
|
34 }
|
Chris@0
|
35 return true;
|
Chris@0
|
36 }
|
Chris@0
|
37
|
Chris@0
|
38 /**
|
Chris@0
|
39 * @inheritdoc
|
Chris@0
|
40 */
|
Chris@0
|
41 public function write(OutputInterface $output, $data, FormatterOptions $options)
|
Chris@0
|
42 {
|
Chris@0
|
43 if (is_string($data)) {
|
Chris@0
|
44 return $output->writeln($data);
|
Chris@0
|
45 }
|
Chris@0
|
46 return $this->reduceToSigleFieldAndWrite($output, $data, $options);
|
Chris@0
|
47 }
|
Chris@0
|
48
|
Chris@0
|
49 /**
|
Chris@0
|
50 * @inheritdoc
|
Chris@0
|
51 */
|
Chris@0
|
52 public function overrideOptions($structuredOutput, FormatterOptions $options)
|
Chris@0
|
53 {
|
Chris@0
|
54 $defaultField = $options->get(FormatterOptions::DEFAULT_STRING_FIELD, [], '');
|
Chris@0
|
55 $userFields = $options->get(FormatterOptions::FIELDS, [FormatterOptions::FIELDS => $options->get(FormatterOptions::FIELD)]);
|
Chris@0
|
56 $optionsOverride = $options->override([]);
|
Chris@0
|
57 if (empty($userFields) && !empty($defaultField)) {
|
Chris@0
|
58 $optionsOverride->setOption(FormatterOptions::FIELDS, $defaultField);
|
Chris@0
|
59 }
|
Chris@0
|
60 return $optionsOverride;
|
Chris@0
|
61 }
|
Chris@0
|
62
|
Chris@0
|
63 /**
|
Chris@0
|
64 * If the data provided to a 'string' formatter is a table, then try
|
Chris@17
|
65 * to emit it in a simplified form (by default, TSV).
|
Chris@0
|
66 *
|
Chris@0
|
67 * @param OutputInterface $output
|
Chris@0
|
68 * @param mixed $data
|
Chris@0
|
69 * @param FormatterOptions $options
|
Chris@0
|
70 */
|
Chris@0
|
71 protected function reduceToSigleFieldAndWrite(OutputInterface $output, $data, FormatterOptions $options)
|
Chris@0
|
72 {
|
Chris@17
|
73 if ($data instanceof StringTransformationInterface) {
|
Chris@17
|
74 $simplified = $data->simplifyToString($options);
|
Chris@17
|
75 return $output->write($simplified);
|
Chris@17
|
76 }
|
Chris@17
|
77
|
Chris@0
|
78 $alternateFormatter = new TsvFormatter();
|
Chris@0
|
79 try {
|
Chris@0
|
80 $data = $alternateFormatter->validate($data);
|
Chris@0
|
81 $alternateFormatter->write($output, $data, $options);
|
Chris@0
|
82 } catch (\Exception $e) {
|
Chris@0
|
83 }
|
Chris@0
|
84 }
|
Chris@0
|
85
|
Chris@0
|
86 /**
|
Chris@0
|
87 * Always validate any data, though. This format will never
|
Chris@0
|
88 * cause an error if it is selected for an incompatible data type; at
|
Chris@0
|
89 * worse, it simply does not print any data.
|
Chris@0
|
90 */
|
Chris@0
|
91 public function validate($structuredData)
|
Chris@0
|
92 {
|
Chris@0
|
93 return $structuredData;
|
Chris@0
|
94 }
|
Chris@0
|
95 }
|