]> BookStack Code Mirror - bookstack/blob - app/Search/SearchOptionSet.php
Copying: Fixed issue with non-page links to page permalinks
[bookstack] / app / Search / SearchOptionSet.php
1 <?php
2
3 namespace BookStack\Search;
4
5 use BookStack\Search\Options\SearchOption;
6
7 /**
8  * @template T of SearchOption
9  */
10 class SearchOptionSet
11 {
12     /**
13      * @var T[]
14      */
15     protected array $options = [];
16
17     /**
18      * @param T[] $options
19      */
20     public function __construct(array $options = [])
21     {
22         $this->options = $options;
23     }
24
25     public function toValueArray(): array
26     {
27         return array_map(fn(SearchOption $option) => $option->value, $this->options);
28     }
29
30     public function toValueMap(): array
31     {
32         $map = [];
33         foreach ($this->options as $index => $option) {
34             $key = $option->getKey() ?? $index;
35             $map[$key] = $option->value;
36         }
37         return $map;
38     }
39
40     public function merge(SearchOptionSet $set): self
41     {
42         return new self(array_merge($this->options, $set->options));
43     }
44
45     public function filterEmpty(): self
46     {
47         $filteredOptions = array_values(array_filter($this->options, fn (SearchOption $option) => !empty($option->value)));
48         return new self($filteredOptions);
49     }
50
51     /**
52      * @param class-string<SearchOption> $class
53      */
54     public static function fromValueArray(array $values, string $class): self
55     {
56         $options = array_map(fn($val) => new $class($val), $values);
57         return new self($options);
58     }
59
60     /**
61      * @return T[]
62      */
63     public function all(): array
64     {
65         return $this->options;
66     }
67
68     /**
69      * @return self<T>
70      */
71     public function negated(): self
72     {
73         $values = array_values(array_filter($this->options, fn (SearchOption $option) => $option->negated));
74         return new self($values);
75     }
76
77     /**
78      * @return self<T>
79      */
80     public function nonNegated(): self
81     {
82         $values = array_values(array_filter($this->options, fn (SearchOption $option) => !$option->negated));
83         return new self($values);
84     }
85 }