1: <?php
2:
3: namespace OpenSearch;
4:
5: use OpenSearch\Endpoints\AbstractEndpoint;
6: use OpenSearch\Serializers\SerializerInterface;
7: use OpenSearch\Serializers\SmartSerializer;
8: use ReflectionClass;
9:
10: /**
11: * A factory for creating endpoints.
12: */
13: class EndpointFactory implements EndpointFactoryInterface
14: {
15: private ?SerializerInterface $serializer;
16:
17: public function __construct(?SerializerInterface $serializer = null)
18: {
19: $this->serializer = $serializer;
20: }
21:
22: /**
23: * {@inheritdoc}
24: */
25: public function getEndpoint(string $class): AbstractEndpoint
26: {
27: return $this->createEndpoint($class);
28: }
29:
30: private function getSerializer(): SerializerInterface
31: {
32: if ($this->serializer === null) {
33: $this->serializer = new SmartSerializer();
34: }
35: return $this->serializer;
36: }
37:
38: /**
39: * Creates an endpoint.
40: *
41: * @phpstan-template T of AbstractEndpoint
42: * @phpstan-param class-string<T> $class
43: * @phpstan-return T
44: * @throws \ReflectionException
45: */
46: private function createEndpoint(string $class): AbstractEndpoint
47: {
48: $reflection = new ReflectionClass($class);
49: $constructor = $reflection->getConstructor();
50:
51: if ($constructor && $constructor->getParameters()) {
52: return new $class($this->getSerializer());
53: }
54: return new $class();
55: }
56:
57: }
58: