2 namespace Consolidation\OutputFormatters\Formatters;
4 use Consolidation\OutputFormatters\Options\FormatterOptions;
5 use Consolidation\OutputFormatters\Options\OverrideOptionsInterface;
6 use Consolidation\OutputFormatters\StructuredData\RestructureInterface;
7 use Consolidation\OutputFormatters\StructuredData\UnstructuredInterface;
8 use Consolidation\OutputFormatters\Transformations\SimplifiedFormatterInterface;
9 use Consolidation\OutputFormatters\Transformations\StringTransformationInterface;
10 use Consolidation\OutputFormatters\Validate\ValidationInterface;
11 use Consolidation\OutputFormatters\Validate\ValidDataTypesTrait;
12 use Symfony\Component\Console\Output\OutputInterface;
17 * This formatter is used as the default action when no
18 * particular formatter is requested. It will print the
19 * provided data only if it is a string; if any other
20 * type is given, then nothing is printed.
22 class StringFormatter implements FormatterInterface, ValidationInterface, OverrideOptionsInterface
25 * By default, we assume that we can convert any data type to `string`,
26 * unless it implements UnstructuredInterface, in which case we won't
27 * allow the `string` format unless the data type also implements
28 * StringTransformationInterface.
30 public function isValidDataType(\ReflectionClass $dataType)
32 if ($dataType->implementsInterface('\Consolidation\OutputFormatters\StructuredData\UnstructuredInterface') && !$dataType->implementsInterface('\Consolidation\OutputFormatters\Transformations\StringTransformationInterface')) {
41 public function write(OutputInterface $output, $data, FormatterOptions $options)
43 if (is_string($data)) {
44 return $output->writeln($data);
46 return $this->reduceToSigleFieldAndWrite($output, $data, $options);
52 public function overrideOptions($structuredOutput, FormatterOptions $options)
54 $defaultField = $options->get(FormatterOptions::DEFAULT_STRING_FIELD, [], '');
55 $userFields = $options->get(FormatterOptions::FIELDS, [FormatterOptions::FIELDS => $options->get(FormatterOptions::FIELD)]);
56 $optionsOverride = $options->override([]);
57 if (empty($userFields) && !empty($defaultField)) {
58 $optionsOverride->setOption(FormatterOptions::FIELDS, $defaultField);
60 return $optionsOverride;
64 * If the data provided to a 'string' formatter is a table, then try
65 * to emit it in a simplified form (by default, TSV).
67 * @param OutputInterface $output
69 * @param FormatterOptions $options
71 protected function reduceToSigleFieldAndWrite(OutputInterface $output, $data, FormatterOptions $options)
73 if ($data instanceof StringTransformationInterface) {
74 $simplified = $data->simplifyToString($options);
75 return $output->write($simplified);
78 $alternateFormatter = new TsvFormatter();
80 $data = $alternateFormatter->validate($data);
81 $alternateFormatter->write($output, $data, $options);
82 } catch (\Exception $e) {
87 * Always validate any data, though. This format will never
88 * cause an error if it is selected for an incompatible data type; at
89 * worse, it simply does not print any data.
91 public function validate($structuredData)
93 return $structuredData;