Passed
Push — sheepy/elevation-configuration ( bdeab0...bcf7bc )
by Marco
18:34
created

DataResolver   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 7
eloc 23
c 2
b 0
f 0
dl 0
loc 68
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A cannotIdentifyException() 0 7 1
A __construct() 0 9 3
A identify() 0 12 3
1
<?php
2
3
namespace Firesphere\SolrSearch\Helpers;
4
5
use Firesphere\SolrSearch\Traits\DataResolveTrait;
6
use LogicException;
7
use SilverStripe\Core\ClassInfo;
8
use SilverStripe\ORM\ArrayList;
9
use SilverStripe\ORM\DataObject;
10
use SilverStripe\ORM\FieldType\DBField;
11
use SilverStripe\ORM\SS_List;
12
use SilverStripe\View\ArrayData;
13
14
class DataResolver
15
{
16
    use DataResolveTrait;
17
18
    /**
19
     * Supported object types
20
     * @var array map of objects to methods
21
     */
22
    private static $objTypes = [
23
        DataObject::class => 'DataObject',
24
        ArrayData::class  => 'ArrayData',
25
        SS_List::class    => 'List',
26
        DBField::class    => 'Field'
27
    ];
28
29
    /**
30
     * DataResolver constructor.
31
     * @param DataObject|ArrayList|SS_List|DBField $component
32
     * @param array|string $columns
33
     */
34
    public function __construct($component, $columns = [])
35
    {
36
        if (!is_array($columns)) {
37
            $columns = array_filter(explode('.', $columns));
38
        }
39
        $this->columns = $columns;
40
        $this->component = $component;
41
        $this->columnName = $this->columns ? array_shift($this->columns) : null;
42
        $this->shortName = ClassInfo::shortName($component);
43
    }
44
45
    /**
46
     * @param DataObject|ArrayData|SS_List $component
47
     * @param array $columns
48
     *
49
     * @return void
50
     * @throws LogicException
51
     */
52
    protected function cannotIdentifyException($component, $columns = []): void
53
    {
54
        throw new LogicException(
55
            sprintf(
56
                'Cannot identify, "%s" from class "%s"',
57
                implode('.', $columns),
58
                ClassInfo::shortName($component)
59
            )
60
        );
61
    }
62
63
    /**
64
     * @param DataObject|ArrayData|SS_List|DBField $obj
65
     * @param array|string $columns
66
     *
67
     * @return mixed
68
     * @throws LogicException
69
     */
70
    public static function identify($obj, $columns = [])
71
    {
72
        /** @var @see {self::$objTypes} $type */
73
        foreach (self::$objTypes as $type => $method) {
74
            if ($obj instanceof $type) {
75
                $method = 'resolve' . $method;
76
77
                return (new self($obj, $columns))->{$method}();
78
            }
79
        }
80
81
        throw new LogicException(sprintf('Class: %s is not supported.', ClassInfo::shortName($obj)));
82
    }
83
}
84