Passed
Push — develop ( 8dad66...1a3273 )
by Freddie
05:52 queued 11s
created

Schema::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 4
dl 0
loc 6
ccs 5
cts 5
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
/*
3
 * This file is part of FlexPHP.
4
 *
5
 * (c) Freddie Gar <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
namespace FlexPHP\Schema;
11
12
use FlexPHP\Schema\Constants\Keyword;
13
use FlexPHP\Schema\Exception\InvalidFileSchemaException;
14
use FlexPHP\Schema\Exception\InvalidSchemaException;
15
use Symfony\Component\Yaml\Exception\ParseException;
16
use Symfony\Component\Yaml\Yaml;
17
18
final class Schema implements SchemaInterface
19
{
20
    /**
21
     * @var string
22
     */
23
    private $name;
24
25
    /**
26
     * @var null|string
27
     */
28
    private $icon;
29
30
    /**
31
     * @var string
32
     */
33
    private $title;
34
35
    /**
36
     * @var array<int,SchemaAttributeInterface>
37
     */
38
    private $attributes;
39
40 11
    public static function fromArray(array $schema): SchemaInterface
41
    {
42
        /** @var string $name */
43 11
        $name = \key($schema) ?? '';
44 11
        $title = $schema[$name][Keyword::TITLE] ?? '';
45 11
        $attributes = $schema[$name][Keyword::ATTRIBUTES] ?? [];
46 11
        $icon = $schema[$name][Keyword::ICON] ?? null;
47
48 11
        return new self($name, $title, $attributes, $icon);
49
    }
50
51 3
    public static function fromFile(string $schemafile): SchemaInterface
52
    {
53
        try {
54 3
            $yaml = new Yaml();
55 3
            $schema = $yaml->parseFile($schemafile);
56 1
        } catch (ParseException $e) {
57 1
            throw new InvalidFileSchemaException();
58
        }
59
60 2
        return self::fromArray($schema);
61
    }
62
63 17
    public function __construct(string $name, string $title, array $attributes, ?string $icon = null)
64
    {
65 17
        $this->setName($name);
66 13
        $this->setTitle($title);
67 8
        $this->setAttributes($attributes);
68 3
        $this->setIcon($icon);
69 3
    }
70
71 11
    public function name(): string
72
    {
73 11
        return $this->name;
74
    }
75
76 2
    public function icon(): ?string
77
    {
78 2
        return $this->icon;
79
    }
80
81 3
    public function title(): string
82
    {
83 3
        return $this->title;
84
    }
85
86 3
    public function attributes(): array
87
    {
88 3
        return $this->attributes;
89
    }
90
91 17
    private function setName(string $name): void
92
    {
93 17
        if (empty(\trim($name))) {
94 4
            throw new InvalidSchemaException('Schema name is required');
95
        }
96
97 13
        $this->name = $name;
98 13
    }
99
100 3
    private function setIcon(?string $icon): void
101
    {
102 3
        $this->icon = $icon;
103 3
    }
104
105 13
    private function setTitle(string $title): void
106
    {
107 13
        if (empty(\trim($title))) {
108 5
            throw new InvalidSchemaException(\sprintf('Schema %s:title is required', $this->name()));
109
        }
110
111 8
        $this->title = $title;
112 8
    }
113
114 8
    private function setAttributes(array $attributes): void
115
    {
116 8
        if (empty($attributes)) {
117 3
            throw new InvalidSchemaException(\sprintf('Schema %s:attributes are required', $this->name()));
118
        }
119
120 5
        $schemaAttributes = [];
121
122 5
        foreach ($attributes as $attribute) {
123 5
            $name = $attribute[Keyword::NAME] ?? '';
124 5
            $dataType = $attribute[Keyword::DATATYPE] ?? '';
125 5
            $constraints = $attribute[Keyword::CONSTRAINTS] ?? '';
126
127 5
            $schemaAttributes[] = new SchemaAttribute($name, $dataType, $constraints);
128
        }
129
130 3
        $this->attributes = $schemaAttributes;
131 3
    }
132
}
133