Passed
Push — master ( a7050c...f62674 )
by Bruno
10:03
created

Field::getMetadataValue()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 2
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace Formularium;
4
5
use Formularium\Exception\Exception;
6
use Formularium\Factory\DatatypeFactory;
7
8
class Field
9
{
10
    use ExtradataTrait;
0 ignored issues
show
introduced by
The trait Formularium\ExtradataTrait requires some properties which are not provided by Formularium\Field: $value, $args
Loading history...
11
12
    /**
13
     * @var string
14
     */
15
    protected $name;
16
17
    /**
18
     * @var Datatype
19
     */
20
    protected $datatype;
21
22
    /**
23
     * @var array
24
     */
25
    protected $renderable;
26
27
    /**
28
     * @var array
29
     */
30
    protected $validators;
31
32
    public static function getFromData(string $name, array $data) : Field
33
    {
34
        if (!$name) {
35 52
            throw new Exception("Missing name in fields");
36
        }
37 52
        if (!array_key_exists('datatype', $data)) {
38 1
            throw new Exception("Missing type in field data for $name");
39
        }
40 51
        return new Field($name, $data['datatype'], $data['renderable'] ?? [], $data['validators'] ?? [], $data['extradata'] ?? []);
41 1
    }
42
43 50
    /**
44
     * @param string $name
45
     * @param string|Datatype $datatype
46
     * @param array $renderable
47
     * @param array $validators
48
     * @param array $extradata
49
     */
50
    public function __construct(string $name, $datatype, array $renderable = [], array $validators = [], array $extradata = [])
51
    {
52
        $this->name = $name;
53 182
        if ($datatype instanceof Datatype) {
54
            $this->datatype = $datatype;
55 182
        } else {
56 182
            $this->datatype = DatatypeFactory::factory($datatype);
57 132
        }
58
        $this->renderable = $renderable;
59 50
        $this->validators = $validators;
60
        foreach ($this->validators as $name => $data) {
61 180
            if (!is_array($data)) {
62 180
                throw new Exception("Validator data for $name must be an array");
63 180
            }
64 180
        }
65 47
        foreach ($extradata as $n => $d) {
66
            $this->extradata[] = ($d instanceof Extradata) ? $d : new Extradata($d['name'], $d['args']);
67
        }
68
    }
69 180
70
    /**
71
     * @param string $name
72
     * @param string|Datatype $datatype
73
     * @param array $renderable
74
     * @param array $validators
75
     * @return self
76
     */
77
    public static function create(string $name, $datatype, array $renderable = [], array $validators = [], array $extradata = []): self
78
    {
79
        return new self($name, $datatype, $renderable, $validators, $extradata);
80
    }
81
82
    public function getName(): string
83 8
    {
84
        return $this->name;
85 8
    }
86
87
    public function getDatatype(): Datatype
88 13
    {
89
        return $this->datatype;
90 13
    }
91
92
    public function getValidators(): array
93 10
    {
94
        return $this->validators;
95 10
    }
96
97
    /**
98
     * @param string $name
99
     * @param mixed $default
100
     * @return mixed
101
     */
102
    public function getValidator(string $name, $default = [])
103 34
    {
104
        return $this->validators[$name] ?? $default;
105 34
    }
106
107
    /**
108
     * Get option value from a validator.
109
     *
110
     * @param string $validator The validator name.
111
     * @param string $option The validation option.
112
     * @param mixed $default The default value.
113
     * @return mixed The option value or the default value if there is none.
114
     */
115
    public function getValidatorOption(string $validator, string $option = 'value', $default = null)
116
    {
117
        return $this->validators[$validator][$option] ?? $default;
118
    }
119
120
    /**
121
     * Sets an option value
122
     *
123
     * @param string $validator
124
     * @param string $option
125
     * @param mixed $value
126
     * @return self
127
     */
128
    public function setValidatorOption(string $validator, string $option, $value): self
129
    {
130
        $this->validators[$validator][$option] = $value;
131
        return $this;
132
    }
133
134
    public function getRenderables(): array
135 3
    {
136
        return $this->renderable;
137 3
    }
138
139
    /**
140
     * @param string $name
141
     * @param mixed $default
142
     * @return mixed
143
     */
144
    public function getRenderable(string $name, $default)
145 2
    {
146
        return $this->renderable[$name] ?? $default;
147 2
    }
148
149
    public function toGraphqlQuery(): string
150 2
    {
151
        return $this->datatype->getGraphqlField($this->getName());
152 2
    }
153
154
    public function toGraphqlTypeDefinition(): string
155
    {
156
        $renderable = array_map(
157
            function ($name, $value) {
158
                $v = $value;
159
                if (is_string($value)) {
160 1
                    $v = '"' . str_replace('"', '\\"', $value) . '"';
161
                }
162 1
                return ' ' . $name . ': ' . $v;
163
            },
164
            array_keys($this->renderable),
165
            $this->renderable
166
        );
167
168
        return $this->getName() . ': ' . $this->datatype->getGraphqlType() .
169
            ($this->getValidator(Datatype::REQUIRED, false) ? '' : '!') .
170
            // TODO: validators
171
            ($this->renderable ? " @renderable(\n" . join("\n", $renderable) . "\n)" : '') .
172
            "\n";
173
    }
174
175
    public function toArray(): array
176
    {
177
        return [
178
            'name' => $this->name,
179
            'datatype' => $this->datatype->getName(),
180
            'validators' => $this->validators,
181
            'renderable' => $this->renderable,
182
            'extradata' => $this->extradata,
183 1
        ];
184
    }
185
}
186