Version 1
[yaffs-website] / vendor / consolidation / output-formatters / src / StructuredData / AbstractStructuredList.php
diff --git a/vendor/consolidation/output-formatters/src/StructuredData/AbstractStructuredList.php b/vendor/consolidation/output-formatters/src/StructuredData/AbstractStructuredList.php
new file mode 100644 (file)
index 0000000..fb1bc53
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+namespace Consolidation\OutputFormatters\StructuredData;
+
+use Consolidation\OutputFormatters\StructuredData\RestructureInterface;
+use Consolidation\OutputFormatters\Options\FormatterOptions;
+use Consolidation\OutputFormatters\StructuredData\ListDataInterface;
+use Consolidation\OutputFormatters\Transformations\ReorderFields;
+use Consolidation\OutputFormatters\Transformations\TableTransformation;
+
+/**
+ * Holds an array where each element of the array is one row,
+ * and each row contains an associative array where the keys
+ * are the field names, and the values are the field data.
+ *
+ * It is presumed that every row contains the same keys.
+ */
+abstract class AbstractStructuredList extends \ArrayObject implements RestructureInterface, ListDataInterface, RenderCellCollectionInterface
+{
+    use RenderCellCollectionTrait;
+    protected $data;
+
+    public function __construct($data)
+    {
+        parent::__construct($data);
+    }
+
+    abstract public function restructure(FormatterOptions $options);
+
+    abstract public function getListData(FormatterOptions $options);
+
+    protected function createTableTransformation($data, $options)
+    {
+        $defaults = $this->defaultOptions();
+        $fieldLabels = $this->getReorderedFieldLabels($data, $options, $defaults);
+
+        $tableTransformer = $this->instantiateTableTransformation($data, $fieldLabels, $options->get(FormatterOptions::ROW_LABELS, $defaults));
+        if ($options->get(FormatterOptions::LIST_ORIENTATION, $defaults)) {
+            $tableTransformer->setLayout(TableTransformation::LIST_LAYOUT);
+        }
+
+        return $tableTransformer;
+    }
+
+    protected function instantiateTableTransformation($data, $fieldLabels, $rowLabels)
+    {
+        return new TableTransformation($data, $fieldLabels, $rowLabels);
+    }
+
+    protected function getReorderedFieldLabels($data, $options, $defaults)
+    {
+        $reorderer = new ReorderFields();
+        $fieldLabels = $reorderer->reorder(
+            $this->getFields($options, $defaults),
+            $options->get(FormatterOptions::FIELD_LABELS, $defaults),
+            $data
+        );
+        return $fieldLabels;
+    }
+
+    protected function getFields($options, $defaults)
+    {
+        $fieldShortcut = $options->get(FormatterOptions::FIELD);
+        if (!empty($fieldShortcut)) {
+            return [$fieldShortcut];
+        }
+        $result = $options->get(FormatterOptions::FIELDS, $defaults);
+        if (!empty($result)) {
+            return $result;
+        }
+        return $options->get(FormatterOptions::DEFAULT_FIELDS, $defaults);
+    }
+
+    /**
+     * A structured list may provide its own set of default options. These
+     * will be used in place of the command's default options (from the
+     * annotations) in instances where the user does not provide the options
+     * explicitly (on the commandline) or implicitly (via a configuration file).
+     *
+     * @return array
+     */
+    protected function defaultOptions()
+    {
+        return [
+            FormatterOptions::FIELDS => [],
+            FormatterOptions::FIELD_LABELS => [],
+            FormatterOptions::ROW_LABELS => [],
+            FormatterOptions::DEFAULT_FIELDS => [],
+        ];
+    }
+}