Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
34 / 34
100.00% covered (success)
100.00%
12 / 12
CRAP
100.00% covered (success)
100.00%
1 / 1
IsTranslatable
100.00% covered (success)
100.00%
34 / 34
100.00% covered (success)
100.00%
12 / 12
20
100.00% covered (success)
100.00%
1 / 1
 translate
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 isTranslatable
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 translateMode
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 supportedTranslateModes
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 supportsTranslateMode
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isSymmetricallyTranslated
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isAsymmetricallyTranslated
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getTranslatableStructure
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
 getTranslatableFileStructure
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 localeValueMap
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
5
 localeListMap
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
4
 isList
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace Cosray\Field\Capability;
6
7use Cosray\Schema\TranslateMode;
8
9trait IsTranslatable
10{
11    protected ?TranslateMode $translateMode = null;
12
13    public function translate(?TranslateMode $mode = TranslateMode::Symmetric): static
14    {
15        $this->translateMode = $mode;
16
17        return $this;
18    }
19
20    public function isTranslatable(): bool
21    {
22        return $this->translateMode !== null;
23    }
24
25    public function translateMode(): ?TranslateMode
26    {
27        return $this->translateMode;
28    }
29
30    /** @return list<TranslateMode> */
31    protected function supportedTranslateModes(): array
32    {
33        return [TranslateMode::Symmetric];
34    }
35
36    public function supportsTranslateMode(TranslateMode $mode): bool
37    {
38        return in_array($mode, $this->supportedTranslateModes(), true);
39    }
40
41    protected function isSymmetricallyTranslated(): bool
42    {
43        return $this->translateMode === TranslateMode::Symmetric;
44    }
45
46    protected function isAsymmetricallyTranslated(): bool
47    {
48        return $this->translateMode === TranslateMode::Asymmetric;
49    }
50
51    /** @return array<string, mixed> */
52    protected function getTranslatableStructure(string $type, mixed $value = null): array
53    {
54        unset($type);
55
56        $value ??= $this->default;
57
58        return [
59            'type' => $this::class,
60            'value' => $this->isTranslatable()
61                ? $this->localeValueMap($value)
62                : $this->scalarValueMap($value),
63        ];
64    }
65
66    /** @return array<string, mixed> */
67    protected function getTranslatableFileStructure(string $type, mixed $value = null): array
68    {
69        unset($type);
70
71        return [
72            'type' => $this::class,
73            'value' => $this->localeListMap($value),
74        ];
75    }
76
77    /** @return array<mixed> */
78    protected function localeValueMap(mixed $value = null): array
79    {
80        $result = is_array($value) ? $value : [];
81
82        foreach ($this->owner->locales() as $locale) {
83            $result[$locale->id] ??= null;
84        }
85
86        if (!is_array($value) && $value !== null) {
87            $result[$this->owner->defaultLocale()->id] = $value;
88        }
89
90        return $result;
91    }
92
93    /** @return array<mixed> */
94    protected function localeListMap(mixed $value = null): array
95    {
96        if (is_array($value) && !$this->isList($value)) {
97            return $value;
98        }
99
100        $result = [];
101
102        foreach ($this->owner->locales() as $locale) {
103            $result[$locale->id] = [];
104        }
105
106        return $result;
107    }
108
109    /** @param array<mixed> $value */
110    private function isList(array $value): bool
111    {
112        return array_is_list($value);
113    }
114}