annotate vendor/consolidation/output-formatters/src/Formatters/StringFormatter.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
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 }