Chain   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 61
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 61
rs 10
c 0
b 0
f 0
wmc 8

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A addFormatter() 0 10 2
A formatSymbol() 0 8 3
A addFormatters() 0 7 2
1
<?php
2
3
namespace Popy\Calendar\Formatter\SymbolFormatter;
4
5
use Popy\Calendar\FormatterInterface;
6
use Popy\Calendar\Parser\FormatToken;
7
use Popy\Calendar\Formatter\SymbolFormatterInterface;
8
use Popy\Calendar\ValueObject\DateRepresentationInterface;
9
10
/**
11
 * Chain/Collection implementation. Will delegate to internal formatters until
12
 * one of them returns a result.
13
 */
14
class Chain implements SymbolFormatterInterface
15
{
16
    /**
17
     * Formatter chain.
18
     *
19
     * @var array<SymbolFormatterInterface>
20
     */
21
    protected $formatters = [];
22
23
    /**
24
     * Class constructor.
25
     *
26
     * @param iterable<SymbolFormatterInterface> $formatters
27
     */
28
    public function __construct($formatters = [])
29
    {
30
        $this->addFormatters($formatters);
31
    }
32
33
    /**
34
     * Adds a formatter to the chain.
35
     *
36
     * @param SymbolFormatterInterface $formatter
37
     */
38
    public function addFormatter(SymbolFormatterInterface $formatter)
39
    {
40
        if ($formatter instanceof self) {
41
            // Reducing recursivity
42
            $this->addFormatters($formatter->formatters);
43
        } else {
44
            $this->formatters[] = $formatter;
45
        }
46
47
        return $this;
48
    }
49
50
    /**
51
     * Add formatters to the chain.
52
     *
53
     * @param iterable<SymbolFormatterInterface> $formatters
54
     */
55
    public function addFormatters($formatters)
56
    {
57
        foreach ($formatters as $formatter) {
58
            $this->addFormatter($formatter);
59
        }
60
61
        return $this;
62
    }
63
64
    /**
65
     * @inheritDoc
66
     */
67
    public function formatSymbol(
68
        DateRepresentationInterface $input,
69
        FormatToken $token,
70
        FormatterInterface $formatter
71
    ) {
72
        foreach ($this->formatters as $f) {
73
            if (null !== $res = $f->formatSymbol($input, $token, $formatter)) {
74
                return $res;
75
            }
76
        }
77
    }
78
}
79