GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Push — master ( 95c197...564e5e )
by Joni
04:32
created

UnspecifiedType   F

Complexity

Total Complexity 81

Size/Duplication

Total Lines 671
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 81
eloc 152
dl 0
loc 671
ccs 198
cts 198
cp 1
rs 2
c 0
b 0
f 0

47 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A asTagged() 0 7 2
A fromElementBase() 0 7 2
A fromDER() 0 3 1
A asOctetString() 0 7 2
A asEnumerated() 0 7 2
A asVideotexString() 0 7 2
A expectType() 0 3 1
A isTagged() 0 3 1
A asConstructedString() 0 7 2
A tag() 0 3 1
A asTime() 0 7 2
A asRelativeOID() 0 7 2
A asNull() 0 7 2
A asString() 0 7 2
A asVisibleString() 0 7 2
A asBMPString() 0 7 2
A asUTCTime() 0 7 2
A asObjectIdentifier() 0 7 2
A toDER() 0 3 1
A asSet() 0 7 2
A asGraphicString() 0 7 2
A asSequence() 0 7 2
A asBoolean() 0 7 2
A asApplication() 0 7 2
A isConstructed() 0 3 1
A asGeneralizedTime() 0 7 2
A asPrintableString() 0 7 2
A asInteger() 0 7 2
A asBitString() 0 7 2
A isType() 0 3 1
A asReal() 0 7 2
A asGeneralString() 0 7 2
A asIA5String() 0 7 2
A typeClass() 0 3 1
A asCharacterString() 0 7 2
A asUTF8String() 0 7 2
A asT61String() 0 7 2
A asObjectDescriptor() 0 7 2
A asPrivate() 0 7 2
A asUniversalString() 0 7 2
A asNumericString() 0 7 2
A _typeDescriptorString() 0 8 2
A asUnspecified() 0 3 1
A _generateExceptionMessage() 0 4 1
A asElement() 0 3 1
A expectTagged() 0 3 1

How to fix   Complexity   

Complex Class

Complex classes like UnspecifiedType often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use UnspecifiedType, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
declare(strict_types = 1);
4
5
namespace Sop\ASN1\Type;
6
7
use Sop\ASN1\Component\Identifier;
8
use Sop\ASN1\Element;
9
use Sop\ASN1\Feature\ElementBase;
10
11
/**
12
 * Decorator class to wrap an element without already knowing the specific
13
 * underlying type.
14
 *
15
 * Provides accessor methods to test the underlying type and return a type
16
 * hinted instance of the concrete element.
17
 */
18
class UnspecifiedType implements ElementBase
19
{
20
    /**
21
     * The wrapped element.
22
     *
23
     * @var Element
24
     */
25
    private $_element;
26
27
    /**
28
     * Constructor.
29
     *
30
     * @param Element $el
31
     */
32 110
    public function __construct(Element $el)
33
    {
34 110
        $this->_element = $el;
35 110
    }
36
37
    /**
38
     * Initialize from DER data.
39
     *
40
     * @param string $data DER encoded data
41
     *
42
     * @return self
43
     */
44 15
    public static function fromDER(string $data): self
45
    {
46 15
        return Element::fromDER($data)->asUnspecified();
47
    }
48
49
    /**
50
     * Initialize from ElementBase interface.
51
     *
52
     * @param ElementBase $el
53
     *
54
     * @return self
55
     */
56 2
    public static function fromElementBase(ElementBase $el): self
57
    {
58
        // if element is already wrapped
59 2
        if ($el instanceof self) {
60 1
            return $el;
61
        }
62 1
        return new self($el->asElement());
63
    }
64
65
    /**
66
     * Get the wrapped element as a context specific tagged type.
67
     *
68
     * @throws \UnexpectedValueException If the element is not tagged
69
     *
70
     * @return TaggedType
71
     */
72 4
    public function asTagged(): TaggedType
73
    {
74 4
        if (!$this->_element instanceof TaggedType) {
75 1
            throw new \UnexpectedValueException(
76 1
                'Tagged element expected, got ' . $this->_typeDescriptorString());
77
        }
78 3
        return $this->_element;
79
    }
80
81
    /**
82
     * Get the wrapped element as an application specific type.
83
     *
84
     * @throws \UnexpectedValueException If element is not application specific
85
     *
86
     * @return \Sop\ASN1\Type\Tagged\ApplicationType
87
     */
88 2
    public function asApplication(): Tagged\ApplicationType
89
    {
90 2
        if (!$this->_element instanceof Tagged\ApplicationType) {
91 1
            throw new \UnexpectedValueException(
92 1
                'Application type expected, got ' . $this->_typeDescriptorString());
93
        }
94 1
        return $this->_element;
95
    }
96
97
    /**
98
     * Get the wrapped element as a private tagged type.
99
     *
100
     * @throws \UnexpectedValueException If element is not using private tagging
101
     *
102
     * @return \Sop\ASN1\Type\Tagged\PrivateType
103
     */
104 2
    public function asPrivate(): Tagged\PrivateType
105
    {
106 2
        if (!$this->_element instanceof Tagged\PrivateType) {
107 1
            throw new \UnexpectedValueException(
108 1
                'Private type expected, got ' . $this->_typeDescriptorString());
109
        }
110 1
        return $this->_element;
111
    }
112
113
    /**
114
     * Get the wrapped element as a boolean type.
115
     *
116
     * @throws \UnexpectedValueException If the element is not a boolean
117
     *
118
     * @return \Sop\ASN1\Type\Primitive\Boolean
119
     */
120 4
    public function asBoolean(): Primitive\Boolean
121
    {
122 4
        if (!$this->_element instanceof Primitive\Boolean) {
123 1
            throw new \UnexpectedValueException(
124 1
                $this->_generateExceptionMessage(Element::TYPE_BOOLEAN));
125
        }
126 3
        return $this->_element;
127
    }
128
129
    /**
130
     * Get the wrapped element as an integer type.
131
     *
132
     * @throws \UnexpectedValueException If the element is not an integer
133
     *
134
     * @return \Sop\ASN1\Type\Primitive\Integer
135
     */
136 6
    public function asInteger(): Primitive\Integer
137
    {
138 6
        if (!$this->_element instanceof Primitive\Integer) {
139 1
            throw new \UnexpectedValueException(
140 1
                $this->_generateExceptionMessage(Element::TYPE_INTEGER));
141
        }
142 5
        return $this->_element;
143
    }
144
145
    /**
146
     * Get the wrapped element as a bit string type.
147
     *
148
     * @throws \UnexpectedValueException If the element is not a bit string
149
     *
150
     * @return \Sop\ASN1\Type\Primitive\BitString
151
     */
152 2
    public function asBitString(): Primitive\BitString
153
    {
154 2
        if (!$this->_element instanceof Primitive\BitString) {
155 1
            throw new \UnexpectedValueException(
156 1
                $this->_generateExceptionMessage(Element::TYPE_BIT_STRING));
157
        }
158 1
        return $this->_element;
159
    }
160
161
    /**
162
     * Get the wrapped element as an octet string type.
163
     *
164
     * @throws \UnexpectedValueException If the element is not an octet string
165
     *
166
     * @return \Sop\ASN1\Type\Primitive\OctetString
167
     */
168 2
    public function asOctetString(): Primitive\OctetString
169
    {
170 2
        if (!$this->_element instanceof Primitive\OctetString) {
171 1
            throw new \UnexpectedValueException(
172 1
                $this->_generateExceptionMessage(Element::TYPE_OCTET_STRING));
173
        }
174 1
        return $this->_element;
175
    }
176
177
    /**
178
     * Get the wrapped element as a null type.
179
     *
180
     * @throws \UnexpectedValueException If the element is not a null
181
     *
182
     * @return \Sop\ASN1\Type\Primitive\NullType
183
     */
184 9
    public function asNull(): Primitive\NullType
185
    {
186 9
        if (!$this->_element instanceof Primitive\NullType) {
187 2
            throw new \UnexpectedValueException(
188 2
                $this->_generateExceptionMessage(Element::TYPE_NULL));
189
        }
190 7
        return $this->_element;
191
    }
192
193
    /**
194
     * Get the wrapped element as an object identifier type.
195
     *
196
     * @throws \UnexpectedValueException If the element is not an object identifier
197
     *
198
     * @return \Sop\ASN1\Type\Primitive\ObjectIdentifier
199
     */
200 12
    public function asObjectIdentifier(): Primitive\ObjectIdentifier
201
    {
202 12
        if (!$this->_element instanceof Primitive\ObjectIdentifier) {
203 1
            throw new \UnexpectedValueException(
204 1
                $this->_generateExceptionMessage(Element::TYPE_OBJECT_IDENTIFIER));
205
        }
206 11
        return $this->_element;
207
    }
208
209
    /**
210
     * Get the wrapped element as an object descriptor type.
211
     *
212
     * @throws \UnexpectedValueException If the element is not an object descriptor
213
     *
214
     * @return \Sop\ASN1\Type\Primitive\ObjectDescriptor
215
     */
216 2
    public function asObjectDescriptor(): Primitive\ObjectDescriptor
217
    {
218 2
        if (!$this->_element instanceof Primitive\ObjectDescriptor) {
219 1
            throw new \UnexpectedValueException(
220 1
                $this->_generateExceptionMessage(Element::TYPE_OBJECT_DESCRIPTOR));
221
        }
222 1
        return $this->_element;
223
    }
224
225
    /**
226
     * Get the wrapped element as a real type.
227
     *
228
     * @throws \UnexpectedValueException If the element is not a real
229
     *
230
     * @return \Sop\ASN1\Type\Primitive\Real
231
     */
232 2
    public function asReal(): Primitive\Real
233
    {
234 2
        if (!$this->_element instanceof Primitive\Real) {
235 1
            throw new \UnexpectedValueException(
236 1
                $this->_generateExceptionMessage(Element::TYPE_REAL));
237
        }
238 1
        return $this->_element;
239
    }
240
241
    /**
242
     * Get the wrapped element as an enumerated type.
243
     *
244
     * @throws \UnexpectedValueException If the element is not an enumerated
245
     *
246
     * @return \Sop\ASN1\Type\Primitive\Enumerated
247
     */
248 2
    public function asEnumerated(): Primitive\Enumerated
249
    {
250 2
        if (!$this->_element instanceof Primitive\Enumerated) {
251 1
            throw new \UnexpectedValueException(
252 1
                $this->_generateExceptionMessage(Element::TYPE_ENUMERATED));
253
        }
254 1
        return $this->_element;
255
    }
256
257
    /**
258
     * Get the wrapped element as a UTF8 string type.
259
     *
260
     * @throws \UnexpectedValueException If the element is not a UTF8 string
261
     *
262
     * @return \Sop\ASN1\Type\Primitive\UTF8String
263
     */
264 2
    public function asUTF8String(): Primitive\UTF8String
265
    {
266 2
        if (!$this->_element instanceof Primitive\UTF8String) {
267 1
            throw new \UnexpectedValueException(
268 1
                $this->_generateExceptionMessage(Element::TYPE_UTF8_STRING));
269
        }
270 1
        return $this->_element;
271
    }
272
273
    /**
274
     * Get the wrapped element as a relative OID type.
275
     *
276
     * @throws \UnexpectedValueException If the element is not a relative OID
277
     *
278
     * @return \Sop\ASN1\Type\Primitive\RelativeOID
279
     */
280 2
    public function asRelativeOID(): Primitive\RelativeOID
281
    {
282 2
        if (!$this->_element instanceof Primitive\RelativeOID) {
283 1
            throw new \UnexpectedValueException(
284 1
                $this->_generateExceptionMessage(Element::TYPE_RELATIVE_OID));
285
        }
286 1
        return $this->_element;
287
    }
288
289
    /**
290
     * Get the wrapped element as a sequence type.
291
     *
292
     * @throws \UnexpectedValueException If the element is not a sequence
293
     *
294
     * @return \Sop\ASN1\Type\Constructed\Sequence
295
     */
296 3
    public function asSequence(): Constructed\Sequence
297
    {
298 3
        if (!$this->_element instanceof Constructed\Sequence) {
299 1
            throw new \UnexpectedValueException(
300 1
                $this->_generateExceptionMessage(Element::TYPE_SEQUENCE));
301
        }
302 2
        return $this->_element;
303
    }
304
305
    /**
306
     * Get the wrapped element as a set type.
307
     *
308
     * @throws \UnexpectedValueException If the element is not a set
309
     *
310
     * @return \Sop\ASN1\Type\Constructed\Set
311
     */
312 2
    public function asSet(): Constructed\Set
313
    {
314 2
        if (!$this->_element instanceof Constructed\Set) {
315 1
            throw new \UnexpectedValueException(
316 1
                $this->_generateExceptionMessage(Element::TYPE_SET));
317
        }
318 1
        return $this->_element;
319
    }
320
321
    /**
322
     * Get the wrapped element as a numeric string type.
323
     *
324
     * @throws \UnexpectedValueException If the element is not a numeric string
325
     *
326
     * @return \Sop\ASN1\Type\Primitive\NumericString
327
     */
328 2
    public function asNumericString(): Primitive\NumericString
329
    {
330 2
        if (!$this->_element instanceof Primitive\NumericString) {
331 1
            throw new \UnexpectedValueException(
332 1
                $this->_generateExceptionMessage(Element::TYPE_NUMERIC_STRING));
333
        }
334 1
        return $this->_element;
335
    }
336
337
    /**
338
     * Get the wrapped element as a printable string type.
339
     *
340
     * @throws \UnexpectedValueException If the element is not a printable
341
     *                                   string
342
     *
343
     * @return \Sop\ASN1\Type\Primitive\PrintableString
344
     */
345 2
    public function asPrintableString(): Primitive\PrintableString
346
    {
347 2
        if (!$this->_element instanceof Primitive\PrintableString) {
348 1
            throw new \UnexpectedValueException(
349 1
                $this->_generateExceptionMessage(Element::TYPE_PRINTABLE_STRING));
350
        }
351 1
        return $this->_element;
352
    }
353
354
    /**
355
     * Get the wrapped element as a T61 string type.
356
     *
357
     * @throws \UnexpectedValueException If the element is not a T61 string
358
     *
359
     * @return \Sop\ASN1\Type\Primitive\T61String
360
     */
361 2
    public function asT61String(): Primitive\T61String
362
    {
363 2
        if (!$this->_element instanceof Primitive\T61String) {
364 1
            throw new \UnexpectedValueException(
365 1
                $this->_generateExceptionMessage(Element::TYPE_T61_STRING));
366
        }
367 1
        return $this->_element;
368
    }
369
370
    /**
371
     * Get the wrapped element as a videotex string type.
372
     *
373
     * @throws \UnexpectedValueException If the element is not a videotex string
374
     *
375
     * @return \Sop\ASN1\Type\Primitive\VideotexString
376
     */
377 2
    public function asVideotexString(): Primitive\VideotexString
378
    {
379 2
        if (!$this->_element instanceof Primitive\VideotexString) {
380 1
            throw new \UnexpectedValueException(
381 1
                $this->_generateExceptionMessage(Element::TYPE_VIDEOTEX_STRING));
382
        }
383 1
        return $this->_element;
384
    }
385
386
    /**
387
     * Get the wrapped element as a IA5 string type.
388
     *
389
     * @throws \UnexpectedValueException If the element is not a IA5 string
390
     *
391
     * @return \Sop\ASN1\Type\Primitive\IA5String
392
     */
393 2
    public function asIA5String(): Primitive\IA5String
394
    {
395 2
        if (!$this->_element instanceof Primitive\IA5String) {
396 1
            throw new \UnexpectedValueException(
397 1
                $this->_generateExceptionMessage(Element::TYPE_IA5_STRING));
398
        }
399 1
        return $this->_element;
400
    }
401
402
    /**
403
     * Get the wrapped element as an UTC time type.
404
     *
405
     * @throws \UnexpectedValueException If the element is not a UTC time
406
     *
407
     * @return \Sop\ASN1\Type\Primitive\UTCTime
408
     */
409 2
    public function asUTCTime(): Primitive\UTCTime
410
    {
411 2
        if (!$this->_element instanceof Primitive\UTCTime) {
412 1
            throw new \UnexpectedValueException(
413 1
                $this->_generateExceptionMessage(Element::TYPE_UTC_TIME));
414
        }
415 1
        return $this->_element;
416
    }
417
418
    /**
419
     * Get the wrapped element as a generalized time type.
420
     *
421
     * @throws \UnexpectedValueException If the element is not a generalized time
422
     *
423
     * @return \Sop\ASN1\Type\Primitive\GeneralizedTime
424
     */
425 2
    public function asGeneralizedTime(): Primitive\GeneralizedTime
426
    {
427 2
        if (!$this->_element instanceof Primitive\GeneralizedTime) {
428 1
            throw new \UnexpectedValueException(
429 1
                $this->_generateExceptionMessage(Element::TYPE_GENERALIZED_TIME));
430
        }
431 1
        return $this->_element;
432
    }
433
434
    /**
435
     * Get the wrapped element as a graphic string type.
436
     *
437
     * @throws \UnexpectedValueException If the element is not a graphic string
438
     *
439
     * @return \Sop\ASN1\Type\Primitive\GraphicString
440
     */
441 2
    public function asGraphicString(): Primitive\GraphicString
442
    {
443 2
        if (!$this->_element instanceof Primitive\GraphicString) {
444 1
            throw new \UnexpectedValueException(
445 1
                $this->_generateExceptionMessage(Element::TYPE_GRAPHIC_STRING));
446
        }
447 1
        return $this->_element;
448
    }
449
450
    /**
451
     * Get the wrapped element as a visible string type.
452
     *
453
     * @throws \UnexpectedValueException If the element is not a visible string
454
     *
455
     * @return \Sop\ASN1\Type\Primitive\VisibleString
456
     */
457 2
    public function asVisibleString(): Primitive\VisibleString
458
    {
459 2
        if (!$this->_element instanceof Primitive\VisibleString) {
460 1
            throw new \UnexpectedValueException(
461 1
                $this->_generateExceptionMessage(Element::TYPE_VISIBLE_STRING));
462
        }
463 1
        return $this->_element;
464
    }
465
466
    /**
467
     * Get the wrapped element as a general string type.
468
     *
469
     * @throws \UnexpectedValueException If the element is not general string
470
     *
471
     * @return \Sop\ASN1\Type\Primitive\GeneralString
472
     */
473 2
    public function asGeneralString(): Primitive\GeneralString
474
    {
475 2
        if (!$this->_element instanceof Primitive\GeneralString) {
476 1
            throw new \UnexpectedValueException(
477 1
                $this->_generateExceptionMessage(Element::TYPE_GENERAL_STRING));
478
        }
479 1
        return $this->_element;
480
    }
481
482
    /**
483
     * Get the wrapped element as a universal string type.
484
     *
485
     * @throws \UnexpectedValueException If the element is not a universal string
486
     *
487
     * @return \Sop\ASN1\Type\Primitive\UniversalString
488
     */
489 2
    public function asUniversalString(): Primitive\UniversalString
490
    {
491 2
        if (!$this->_element instanceof Primitive\UniversalString) {
492 1
            throw new \UnexpectedValueException(
493 1
                $this->_generateExceptionMessage(Element::TYPE_UNIVERSAL_STRING));
494
        }
495 1
        return $this->_element;
496
    }
497
498
    /**
499
     * Get the wrapped element as a character string type.
500
     *
501
     * @throws \UnexpectedValueException If the element is not a character string
502
     *
503
     * @return \Sop\ASN1\Type\Primitive\CharacterString
504
     */
505 2
    public function asCharacterString(): Primitive\CharacterString
506
    {
507 2
        if (!$this->_element instanceof Primitive\CharacterString) {
508 1
            throw new \UnexpectedValueException(
509 1
                $this->_generateExceptionMessage(Element::TYPE_CHARACTER_STRING));
510
        }
511 1
        return $this->_element;
512
    }
513
514
    /**
515
     * Get the wrapped element as a BMP string type.
516
     *
517
     * @throws \UnexpectedValueException If the element is not a bmp string
518
     *
519
     * @return \Sop\ASN1\Type\Primitive\BMPString
520
     */
521 2
    public function asBMPString(): Primitive\BMPString
522
    {
523 2
        if (!$this->_element instanceof Primitive\BMPString) {
524 1
            throw new \UnexpectedValueException(
525 1
                $this->_generateExceptionMessage(Element::TYPE_BMP_STRING));
526
        }
527 1
        return $this->_element;
528
    }
529
530
    /**
531
     * Get the wrapped element as a constructed string type.
532
     *
533
     * @throws \UnexpectedValueException If the element is not a constructed string
534
     *
535
     * @return \Sop\ASN1\Type\Constructed\ConstructedString
536
     */
537 2
    public function asConstructedString(): Constructed\ConstructedString
538
    {
539 2
        if (!$this->_element instanceof Constructed\ConstructedString) {
540 1
            throw new \UnexpectedValueException(
541 1
                $this->_generateExceptionMessage(Element::TYPE_CONSTRUCTED_STRING));
542
        }
543 1
        return $this->_element;
544
    }
545
546
    /**
547
     * Get the wrapped element as any string type.
548
     *
549
     * @throws \UnexpectedValueException If the element is not a string
550
     *
551
     * @return StringType
552
     */
553 2
    public function asString(): StringType
554
    {
555 2
        if (!$this->_element instanceof StringType) {
556 1
            throw new \UnexpectedValueException(
557 1
                $this->_generateExceptionMessage(Element::TYPE_STRING));
558
        }
559 1
        return $this->_element;
560
    }
561
562
    /**
563
     * Get the wrapped element as any time type.
564
     *
565
     * @throws \UnexpectedValueException If the element is not a time
566
     *
567
     * @return TimeType
568
     */
569 2
    public function asTime(): TimeType
570
    {
571 2
        if (!$this->_element instanceof TimeType) {
572 1
            throw new \UnexpectedValueException(
573 1
                $this->_generateExceptionMessage(Element::TYPE_TIME));
574
        }
575 1
        return $this->_element;
576
    }
577
578
    /**
579
     * {@inheritdoc}
580
     */
581 1
    public function toDER(): string
582
    {
583 1
        return $this->_element->toDER();
584
    }
585
586
    /**
587
     * {@inheritdoc}
588
     */
589 2
    public function typeClass(): int
590
    {
591 2
        return $this->_element->typeClass();
592
    }
593
594
    /**
595
     * {@inheritdoc}
596
     */
597 3
    public function isConstructed(): bool
598
    {
599 3
        return $this->_element->isConstructed();
600
    }
601
602
    /**
603
     * {@inheritdoc}
604
     */
605 8
    public function tag(): int
606
    {
607 8
        return $this->_element->tag();
608
    }
609
610
    /**
611
     * {@inheritdoc}
612
     */
613 1
    public function isType(int $tag): bool
614
    {
615 1
        return $this->_element->isType($tag);
616
    }
617
618
    /**
619
     * {@inheritdoc}
620
     *
621
     * Consider using any of the `as*` accessor methods instead.
622
     */
623 1
    public function expectType(int $tag): ElementBase
624
    {
625 1
        return $this->_element->expectType($tag);
626
    }
627
628
    /**
629
     * {@inheritdoc}
630
     */
631 1
    public function isTagged(): bool
632
    {
633 1
        return $this->_element->isTagged();
634
    }
635
636
    /**
637
     * {@inheritdoc}
638
     *
639
     * Consider using `asTagged()` method instead and chaining
640
     * with `TaggedType::asExplicit()` or `TaggedType::asImplicit()`.
641
     */
642 1
    public function expectTagged(?int $tag = null): TaggedType
643
    {
644 1
        return $this->_element->expectTagged($tag);
645
    }
646
647
    /**
648
     * {@inheritdoc}
649
     */
650 1
    public function asElement(): Element
651
    {
652 1
        return $this->_element;
653
    }
654
655
    /**
656
     * {@inheritdoc}
657
     */
658 1
    public function asUnspecified(): UnspecifiedType
659
    {
660 1
        return $this;
661
    }
662
663
    /**
664
     * Generate message for exceptions thrown by `as*` methods.
665
     *
666
     * @param int $tag Type tag of the expected element
667
     *
668
     * @return string
669
     */
670 30
    private function _generateExceptionMessage(int $tag): string
671
    {
672 30
        return sprintf('%s expected, got %s.', Element::tagToName($tag),
673 30
            $this->_typeDescriptorString());
674
    }
675
676
    /**
677
     * Get textual description of the wrapped element for debugging purposes.
678
     *
679
     * @return string
680
     */
681 33
    private function _typeDescriptorString(): string
682
    {
683 33
        $type_cls = $this->_element->typeClass();
684 33
        $tag = $this->_element->tag();
685 33
        if (Identifier::CLASS_UNIVERSAL === $type_cls) {
686 32
            return Element::tagToName($tag);
687
        }
688 1
        return Identifier::classToName($type_cls) . " TAG {$tag}";
689
    }
690
}
691