summaryrefslogtreecommitdiffstats
path: root/modules/doc/library/Doc/DocSectionFilterIterator.php
blob: bac5a67421cd8bd804edc983387216827b5dcf0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php
/* Icinga Web 2 | (c) 2014 Icinga Development Team | GPLv2+ */

namespace Icinga\Module\Doc;

use Countable;
use RecursiveFilterIterator;
use Icinga\Data\Tree\TreeNodeIterator;

/**
 * Recursive filter iterator over sections that are part of a particular chapter
 *
 * @method TreeNodeIterator getInnerIterator() {
 *     {@inheritdoc}
 * }
 */
class DocSectionFilterIterator extends RecursiveFilterIterator implements Countable
{
    /**
     * Chapter to filter for
     *
     * @var string
     */
    protected $chapter;

    /**
     * Create a new recursive filter iterator over sections that are part of a particular chapter
     *
     * @param TreeNodeIterator  $iterator
     * @param string            $chapter      The chapter to filter for
     */
    public function __construct(TreeNodeIterator $iterator, $chapter)
    {
        parent::__construct($iterator);
        $this->chapter = $chapter;
    }

    /**
     * Accept sections that are part of the given chapter
     *
     * @return bool Whether the current element of the iterator is acceptable
     *              through this filter
     */
    public function accept(): bool
    {
        $section = $this->current();
        /** @var \Icinga\Module\Doc\DocSection $section */
        if ($section->getChapter()->getId() === $this->chapter) {
            return true;
        }
        return false;
    }

    public function getChildren(): self
    {
        return new static($this->getInnerIterator()->getChildren(), $this->chapter);
    }

    public function count(): int
    {
        return iterator_count($this);
    }

    /**
     * Whether the filter swallowed every section
     *
     * @return bool
     */
    public function isEmpty()
    {
        return $this->count() === 0;
    }
}