1: <?php
2: declare(strict_types=1);
3:
4: namespace om\ICal\Timezone;
5:
6: use DateTimeZone;
7: use om\ICal\Component;
8:
9: /**
10: * Asks the resolvers in order and returns the first result.
11: */
12: final readonly class CompositeTimezoneResolver implements TimezoneResolver {
13: /** @var list<TimezoneResolver> */
14: private array $resolvers;
15:
16: public function __construct(TimezoneResolver ...$resolvers) {
17: $this->resolvers = array_values($resolvers);
18: }
19:
20: /**
21: * VTIMEZONE of the calendar, IANA names, aliases, then the optional fallback.
22: */
23: public static function default(?DateTimeZone $fallback = null): self {
24: $names = new self(new IanaTimezoneResolver(), new AliasTimezoneResolver());
25: return new self(new VTimezoneResolver($names), $names, ...($fallback === null ? [] : [new FallbackTimezoneResolver($fallback)]));
26: }
27:
28: public function resolve(string $tzid, Component $calendar): ?ResolvedTimezone {
29: foreach ($this->resolvers as $resolver) {
30: if (($resolved = $resolver->resolve($tzid, $calendar)) !== null) {
31: return $resolved;
32: }
33: }
34: return null;
35: }
36: }
37: