Passed
Push — main ( 356376...dbc0c9 )
by Michael
12:39
created

HelpsLoopFunctions::allowsDynamicProperties()   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 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace MichaelRubel\LoopFunctions\Traits;
6
7
trait HelpsLoopFunctions
8
{
9
    /**
10
     * Assign the value to the property or rescue.
11
     *
12
     * @param int|string $key
13
     * @param mixed      $value
14
     * @param mixed|null $rescue
15
     *
16
     * @return void
17
     * @throws \ReflectionException
18
     */
19 18
    private function assignValue(int|string $key, mixed $value, mixed $rescue = null): void
20
    {
21 18
        if ($this->canAssignValue($key)) {
22 17
            rescue(
23 17
                fn () => $this->{$key} = $value,
24
                $rescue,
25 17
                config('loop-functions.log') ?? false
26
            );
27
        }
28
    }
29
30
    /**
31
     * @param int|string $key
32
     *
33
     * @return bool
34
     * @throws \ReflectionException
35
     */
36 18
    private function canAssignValue(int|string $key): bool
37
    {
38 18
        return is_string($key)
39 18
            && $this->checksPropertyExists($key)
40 18
            && (empty($this->{$key}) || $this->hasDefaultValue($key));
41
    }
42
43
    /**
44
     * @param int|string $key
45
     *
46
     * @return bool
47
     */
48 18
    private function checksPropertyExists(int|string $key): bool
49
    {
50 18
        if ($this->allowsDynamicProperties()) {
51 1
            return true;
52
        }
53
54 17
        return property_exists($this, $key);
55
    }
56
57
    /**
58
     * @param int|string $key
59
     *
60
     * @return bool
61
     * @throws \ReflectionException
62
     */
63 3
    private function hasDefaultValue(int|string $key): bool
64
    {
65 3
        $default = (new \ReflectionProperty($this, $key))
66 3
            ->getDefaultValue();
67
68 3
        return ! empty($default);
69
    }
70
71
    /**
72
     * @param mixed $value
73
     *
74
     * @return bool
75
     */
76 9
    private function canWalkRecursively(mixed $value): bool
77
    {
78 9
        return is_array($value) || $value instanceof \ArrayAccess;
79
    }
80
81
    /**
82
     * @return bool
83
     */
84 18
    private function allowsDynamicProperties(): bool
85
    {
86 18
        return config('loop-functions.dynamic_properties', true);
87
    }
88
89
    /**
90
     * @return array
91
     */
92 18
    private function ignoredPropertyNames(): array
93
    {
94 18
        return config('loop-functions.ignore_keys', ['id', 'password']);
95
    }
96
}
97