Completed
Branch Version3 (22030a)
by Sam
01:45
created

AlignedRdataFormatters   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 118
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 95.92%

Importance

Changes 0
Metric Value
wmc 8
lcom 1
cbo 3
dl 0
loc 118
ccs 47
cts 49
cp 0.9592
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A getRdataFormatters() 0 8 1
A SOA() 0 24 1
A APL() 0 12 2
A LOC() 0 22 1
A makeLine() 0 10 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of Badcow DNS Library.
7
 *
8
 * (c) Samuel Williams <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Badcow\DNS;
15
16
use Badcow\DNS\Parser\Tokens;
17
use Badcow\DNS\Rdata\APL;
18
use Badcow\DNS\Rdata\LOC;
19
use Badcow\DNS\Rdata\SOA;
20
21
class AlignedRdataFormatters
22
{
23
    private function __construct()
24
    {
25
    }
26
27
    /**
28
     * @return callable[]
29
     */
30 3
    public static function getRdataFormatters(): array
31
    {
32
        return [
33 3
            SOA::TYPE => __CLASS__.'::SOA',
34 3
            APL::TYPE => __CLASS__.'::APL',
35
            LOC::TYPE => __CLASS__.'::LOC',
36
        ];
37
    }
38
39
    /**
40
     * @param SOA $rdata
41
     * @param int $padding
42
     *
43
     * @return string
44
     */
45 3
    public static function SOA(SOA $rdata, int $padding): string
46
    {
47
        $vars = [
48 3
            $rdata->getMname(),
49 3
            $rdata->getRname(),
50 3
            $rdata->getSerial(),
51 3
            $rdata->getRefresh(),
52 3
            $rdata->getRetry(),
53 3
            $rdata->getExpire(),
54 3
            $rdata->getMinimum(),
55
        ];
56
57 3
        $longestVarLength = max(array_map('strlen', $vars));
58
59
        return Tokens::OPEN_BRACKET.Tokens::LINE_FEED.
60 3
            self::makeLine((string) $rdata->getMname(), 'MNAME', $longestVarLength, $padding).
61 3
            self::makeLine((string) $rdata->getRname(), 'RNAME', $longestVarLength, $padding).
62 3
            self::makeLine((string) $rdata->getSerial(), 'SERIAL', $longestVarLength, $padding).
63 3
            self::makeLine((string) $rdata->getRefresh(), 'REFRESH', $longestVarLength, $padding).
64 3
            self::makeLine((string) $rdata->getRetry(), 'RETRY', $longestVarLength, $padding).
65 3
            self::makeLine((string) $rdata->getExpire(), 'EXPIRE', $longestVarLength, $padding).
66 3
            self::makeLine((string) $rdata->getMinimum(), 'MINIMUM', $longestVarLength, $padding).
67 3
            str_repeat(' ', $padding).Tokens::CLOSE_BRACKET;
68
    }
69
70
    /**
71
     * @param APL $rdata
72
     * @param int $padding
73
     *
74
     * @return string
75
     */
76 1
    public static function APL(APL $rdata, int $padding): string
77
    {
78 1
        $blocks = explode(' ', $rdata->toText());
79 1
        $longestVarLength = max(array_map('strlen', $blocks));
80 1
        $string = Tokens::OPEN_BRACKET.Tokens::LINE_FEED;
81
82 1
        foreach ($blocks as $block) {
83 1
            $string .= self::makeLine($block, null, $longestVarLength, $padding);
84
        }
85
86 1
        return $string.str_repeat(' ', $padding).Tokens::CLOSE_BRACKET;
87
    }
88
89
    /**
90
     * @param LOC $rdata
91
     * @param int $padding
92
     *
93
     * @return string
94
     */
95 3
    public static function LOC(LOC $rdata, int $padding): string
96
    {
97
        $parts = [
98 3
            $rdata->getLatitude(LOC::FORMAT_DMS),
99 3
            $rdata->getLongitude(LOC::FORMAT_DMS),
100 3
            sprintf('%.2fm', $rdata->getAltitude()),
101 3
            sprintf('%.2fm', $rdata->getSize()),
102 3
            sprintf('%.2fm', $rdata->getHorizontalPrecision()),
103 3
            sprintf('%.2fm', $rdata->getVerticalPrecision()),
104
        ];
105
106 3
        $longestVarLength = max(array_map('strlen', $parts));
107
108
        return Tokens::OPEN_BRACKET.Tokens::LINE_FEED.
109 3
            self::makeLine((string) $rdata->getLatitude(LOC::FORMAT_DMS), 'LATITUDE', $longestVarLength, $padding).
110 3
            self::makeLine((string) $rdata->getLongitude(LOC::FORMAT_DMS), 'LONGITUDE', $longestVarLength, $padding).
111 3
            self::makeLine(sprintf('%.2fm', $rdata->getAltitude()), 'ALTITUDE', $longestVarLength, $padding).
112 3
            self::makeLine(sprintf('%.2fm', $rdata->getSize()), 'SIZE', $longestVarLength, $padding).
113 3
            self::makeLine(sprintf('%.2fm', $rdata->getHorizontalPrecision()), 'HORIZONTAL PRECISION', $longestVarLength, $padding).
114 3
            self::makeLine(sprintf('%.2fm', $rdata->getVerticalPrecision()), 'VERTICAL PRECISION', $longestVarLength, $padding).
115 3
            str_repeat(' ', $padding).Tokens::CLOSE_BRACKET;
116
    }
117
118
    /**
119
     * Returns a padded line with comment.
120
     *
121
     * @param string $text
122
     * @param string $comment
123
     * @param int    $longestVarLength
124
     * @param int    $padding
125
     *
126
     * @return string
127
     */
128 3
    public static function makeLine(string $text, ?string $comment, int $longestVarLength, int $padding): string
129
    {
130 3
        $output = str_repeat(' ', $padding).str_pad($text, $longestVarLength);
131
132 3
        if (null !== $comment) {
133 3
            $output .= ' '.Tokens::SEMICOLON.Tokens::SPACE.$comment;
134
        }
135
136 3
        return $output.Tokens::LINE_FEED;
137
    }
138
}
139