-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGenericFieldSetBuilder.php
More file actions
102 lines (80 loc) · 2.64 KB
/
GenericFieldSetBuilder.php
File metadata and controls
102 lines (80 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
declare(strict_types=1);
/*
* This file is part of the RollerworksSearch package.
*
* (c) Sebastiaan Stok <s.stok@rollerscapes.net>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Rollerworks\Component\Search;
use Rollerworks\Component\Search\Exception\InvalidArgumentException;
use Rollerworks\Component\Search\Field\FieldConfig;
/**
* The FieldSetBuilder helps with building a {@link FieldSet}.
*
* @author Sebastiaan Stok <s.stok@rollerscapes.net>
*/
final class GenericFieldSetBuilder implements FieldSetBuilder
{
/** @var array<string, FieldConfig> */
private array $fields = [];
/** @var array<string, array{type: string, options: array}> */
private array $unresolvedFields = [];
public function __construct(
private readonly SearchFactory $searchFactory,
) {
}
public function set(FieldConfig $field): self
{
$name = $field->getName();
unset($this->unresolvedFields[$name]);
$this->fields[$name] = $field;
return $this;
}
public function add(string $name, string $type, array $options = []): self
{
$this->unresolvedFields[$name] = [
'type' => $type,
'options' => $options,
];
return $this;
}
public function remove(string $name): self
{
unset($this->fields[$name], $this->unresolvedFields[$name]);
return $this;
}
public function has(string $name): bool
{
return isset($this->unresolvedFields[$name]) || isset($this->fields[$name]);
}
public function get(string $name): FieldConfig
{
if (isset($this->unresolvedFields[$name])) {
$this->fields[$name] = $this->searchFactory->createField(
$name,
$this->unresolvedFields[$name]['type'],
$this->unresolvedFields[$name]['options']
);
unset($this->unresolvedFields[$name]);
}
if (isset($this->fields[$name])) {
return $this->fields[$name];
}
throw new InvalidArgumentException(\sprintf('The field with the name "%s" does not exist.', $name));
}
public function getFieldSet(?string $name = null): FieldSet
{
foreach ($this->unresolvedFields as $fieldName => $config) {
$this->fields[$fieldName] = $this->searchFactory->createField(
$fieldName,
$config['type'],
$config['options']
);
unset($this->unresolvedFields[$fieldName]);
}
return new GenericFieldSet($this->fields, $name);
}
}