|
3 | 3 |
|
4 | 4 | namespace Soap\Encoding\Xml\Writer; |
5 | 5 |
|
| 6 | +use Closure; |
6 | 7 | use Generator; |
7 | 8 | use Soap\Encoding\Encoder\Context; |
8 | 9 | use Soap\Encoding\Encoder\Feature; |
9 | 10 | use Soap\Encoding\Encoder\XmlEncoder; |
| 11 | +use VeeWee\Reflecta\Iso\Iso; |
10 | 12 | use XMLWriter; |
11 | 13 | use function VeeWee\Xml\Writer\Builder\cdata; |
12 | 14 | use function VeeWee\Xml\Writer\Builder\children; |
|
15 | 17 | final class ElementValueBuilder |
16 | 18 | { |
17 | 19 | /** |
18 | | - * @param XmlEncoder<mixed, string> $encoder |
19 | | - * @psalm-param mixed $value |
| 20 | + * @param list<Closure(XMLWriter): Generator<bool>> $builders |
20 | 21 | */ |
21 | | - public function __construct( |
22 | | - private readonly Context $context, |
23 | | - private readonly XmlEncoder $encoder, |
24 | | - private readonly mixed $value |
| 22 | + private function __construct( |
| 23 | + private readonly array $builders, |
25 | 24 | ) { |
26 | 25 | } |
27 | 26 |
|
28 | 27 | /** |
29 | | - * @return Generator<bool> |
| 28 | + * @param XmlEncoder<mixed, string> $encoder |
| 29 | + * @psalm-param mixed $value |
30 | 30 | */ |
31 | | - public function __invoke(XMLWriter $writer): Generator |
| 31 | + public static function fromEncoder(Context $context, XmlEncoder $encoder, mixed $value): self |
32 | 32 | { |
33 | | - yield from children([ |
34 | | - $this->buildXsiType(...), |
35 | | - $this->buildValue(...), |
36 | | - ])($writer); |
| 33 | + return new self([ |
| 34 | + XsiAttributeBuilder::forEncodedValue($context, $encoder, $value), |
| 35 | + self::valueWriter($encoder, static fn (): string => $encoder->iso($context)->to($value)), |
| 36 | + ]); |
37 | 37 | } |
38 | 38 |
|
39 | 39 | /** |
40 | | - * @return Generator<bool> |
| 40 | + * @param XmlEncoder<mixed, string> $encoder |
| 41 | + * @param Iso<mixed, string> $iso |
| 42 | + * @psalm-param mixed $value |
41 | 43 | */ |
42 | | - private function buildXsiType(XMLWriter $writer): Generator |
| 44 | + public static function fromIso(Context $context, XmlEncoder $encoder, Iso $iso, mixed $value): self |
43 | 45 | { |
44 | | - yield from XsiAttributeBuilder::forEncodedValue( |
45 | | - $this->context, |
46 | | - $this->encoder, |
47 | | - $this->value, |
48 | | - )($writer); |
| 46 | + return new self([ |
| 47 | + XsiAttributeBuilder::forEncodedValue($context, $encoder, $value), |
| 48 | + self::valueWriter($encoder, static fn (): string => $iso->to($value)), |
| 49 | + ]); |
49 | 50 | } |
50 | 51 |
|
51 | 52 | /** |
52 | | - * @deprecated Use XsiAttributeBuilder::resolveXsiTypeForValue() instead. Will be removed in 1.0.0. |
| 53 | + * @return Generator<bool> |
53 | 54 | */ |
54 | | - public static function resolveXsiTypeForValue(Context $context, mixed $value): string |
| 55 | + public function __invoke(XMLWriter $writer): Generator |
55 | 56 | { |
56 | | - return XsiAttributeBuilder::resolveXsiTypeForValue($context, $value); |
| 57 | + yield from children($this->builders)($writer); |
57 | 58 | } |
58 | 59 |
|
59 | 60 | /** |
60 | | - * @deprecated Use XsiAttributeBuilder::shouldIncludeXsiTargetNamespace() instead. Will be removed in 1.0.0. |
| 61 | + * @param XmlEncoder<mixed, string> $encoder |
| 62 | + * @param Closure(): string $valueProvider |
| 63 | + * |
| 64 | + * @return Closure(XMLWriter): Generator<bool> |
61 | 65 | */ |
62 | | - public static function shouldIncludeXsiTargetNamespace(Context $context): bool |
| 66 | + private static function valueWriter(XmlEncoder $encoder, Closure $valueProvider): Closure |
63 | 67 | { |
64 | | - return XsiAttributeBuilder::shouldIncludeXsiTargetNamespace($context); |
65 | | - } |
| 68 | + $isCData = $encoder instanceof Feature\CData; |
66 | 69 |
|
67 | | - /** |
68 | | - * @return Generator<bool> |
69 | | - */ |
70 | | - private function buildValue(XMLWriter $writer): Generator |
71 | | - { |
72 | | - $encoded = $this->encoder->iso($this->context)->to($this->value); |
| 70 | + return static function (XMLWriter $writer) use ($isCData, $valueProvider): Generator { |
| 71 | + $encoded = $valueProvider(); |
| 72 | + $builder = $isCData ? cdata(value($encoded)) : value($encoded); |
73 | 73 |
|
74 | | - $builder = match (true) { |
75 | | - $this->encoder instanceof Feature\CData => cdata(value($encoded)), |
76 | | - default => value($encoded) |
| 74 | + yield from $builder($writer); |
77 | 75 | }; |
78 | | - |
79 | | - yield from $builder($writer); |
80 | 76 | } |
81 | 77 | } |
0 commit comments