Completed
Push — master ( ac62eb...633109 )
by Dawid
03:39
created

DecimalNumber::getExtractor()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 0
crap 1
1
<?php declare(strict_types=1);
2
3
namespace Igni\Storage\Mapping\Strategy;
4
5
use Igni\Storage\Mapping\MappingStrategy;
6
use Igni\Utils\ReflectionApi\RuntimeMethod;
7
8
final class DecimalNumber implements MappingStrategy, DefaultAttributesProvider
9
{
10 3
    public static function hydrate(&$value, array $attributes = []): void
11
    {
12 3
        $value = self::formatDecimalNumber((string) $value, $attributes);
13 3
    }
14
15 2
    public static function extract(&$value, array $attributes = []): void
16
    {
17 2
        $value = self::formatDecimalNumber((string) $value, $attributes);
18 2
    }
19
20 4
    public static function getDefaultAttributes(): array
21
    {
22
        return [
23 4
            'scale' => 10,
24
            'precision' => 2,
25
        ];
26
    }
27
28 5
    private static function formatDecimalNumber(string $number, array $attributes): string
29
    {
30 5
        $parts = explode('.', $number);
31 5
        if (strlen($parts[0]) > $attributes['scale']) {
32 1
            $parts[0] = str_repeat('9', $attributes['scale']);
33
        }
34 5
        $number = $parts[0] . '.' . ($parts[1] ?? '');
35
36 5
        return bcadd($number, '0', $attributes['precision']);
37
    }
38
}
39