GeneralSubtrees::toASN1()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 8
cts 8
cp 1
rs 9.9
c 0
b 0
f 0
nc 2
cc 2
nop 0
crap 2
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace X509\Certificate\Extension\NameConstraints;
6
7
use ASN1\Type\UnspecifiedType;
8
use ASN1\Type\Constructed\Sequence;
9
10
/**
11
 * Implements <i>GeneralSubtrees</i> ASN.1 type used by
12
 * 'Name Constraints' certificate extension.
13
 *
14
 * @link @link https://tools.ietf.org/html/rfc5280#section-4.2.1.10
15
 */
16
class GeneralSubtrees implements \Countable, \IteratorAggregate
17
{
18
    /**
19
     * Subtrees.
20
     *
21
     * @var GeneralSubtree[] $_subtrees
22
     */
23
    protected $_subtrees;
24
    
25
    /**
26
     * Constructor.
27
     *
28
     * @param GeneralSubtree ...$subtrees
29
     */
30 14
    public function __construct(GeneralSubtree ...$subtrees)
31
    {
32 14
        $this->_subtrees = $subtrees;
33 14
    }
34
    
35
    /**
36
     * Initialize from ASN.1.
37
     *
38
     * @param Sequence $seq
39
     * @return self
40
     */
41 11
    public static function fromASN1(Sequence $seq): self
42
    {
43 11
        $subtrees = array_map(
44 11
            function (UnspecifiedType $el) {
45 10
                return GeneralSubtree::fromASN1($el->asSequence());
46 11
            }, $seq->elements());
47 11
        if (!count($subtrees)) {
48 1
            throw new \UnexpectedValueException(
49 1
                "GeneralSubtrees must contain at least one GeneralSubtree.");
50
        }
51 10
        return new self(...$subtrees);
52
    }
53
    
54
    /**
55
     * Get all subtrees.
56
     *
57
     * @return GeneralSubtree[]
58
     */
59 5
    public function all(): array
60
    {
61 5
        return $this->_subtrees;
62
    }
63
    
64
    /**
65
     * Generate ASN.1 structure.
66
     *
67
     * @return Sequence
68
     */
69 18
    public function toASN1(): Sequence
70
    {
71 18
        if (!count($this->_subtrees)) {
72 1
            throw new \LogicException("No subtrees.");
73
        }
74 17
        $elements = array_map(
75 17
            function (GeneralSubtree $gs) {
76 17
                return $gs->toASN1();
77 17
            }, $this->_subtrees);
78 17
        return new Sequence(...$elements);
79
    }
80
    
81
    /**
82
     *
83
     * @see \Countable::count()
84
     * @return int
85
     */
86 2
    public function count(): int
87
    {
88 2
        return count($this->_subtrees);
89
    }
90
    
91
    /**
92
     * Get iterator for subtrees.
93
     *
94
     * @see \IteratorAggregate::getIterator()
95
     * @return \ArrayIterator
96
     */
97 2
    public function getIterator(): \ArrayIterator
98
    {
99 2
        return new \ArrayIterator($this->_subtrees);
100
    }
101
}
102