ParamHelpers::castToType()   A
last analyzed

Complexity

Conditions 5
Paths 3

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 24
rs 9.2248
c 0
b 0
f 0
cc 5
nc 3
nop 2
1
<?php
2
3
namespace Mpociot\ApiDoc\Extracting;
4
5
use Faker\Factory;
6
use stdClass;
7
8
trait ParamHelpers
9
{
10
    protected function generateDummyValue(string $type)
11
    {
12
        $faker = Factory::create();
13
        if ($this->config->get('faker_seed')) {
14
            $faker->seed($this->config->get('faker_seed'));
0 ignored issues
show
Bug introduced by
The property config does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
15
        }
16
        $fakeFactories = [
17
            'integer' => function () use ($faker) {
18
                return $faker->numberBetween(1, 20);
19
            },
20
            'number' => function () use ($faker) {
21
                return $faker->randomFloat();
22
            },
23
            'float' => function () use ($faker) {
24
                return $faker->randomFloat();
25
            },
26
            'boolean' => function () use ($faker) {
27
                return $faker->boolean();
28
            },
29
            'string' => function () use ($faker) {
30
                return $faker->word;
31
            },
32
            'array' => function () {
33
                return [];
34
            },
35
            'object' => function () {
36
                return new stdClass();
37
            },
38
        ];
39
40
        $fakeFactory = $fakeFactories[$type] ?? $fakeFactories['string'];
41
42
        return $fakeFactory();
43
    }
44
45
    /**
46
     * Cast a value from a string to a specified type.
47
     *
48
     * @param string $value
49
     * @param string $type
50
     *
51
     * @return mixed
52
     */
53
    protected function castToType(string $value, string $type)
54
    {
55
        $casts = [
56
            'integer' => 'intval',
57
            'int' => 'intval',
58
            'float' => 'floatval',
59
            'number' => 'floatval',
60
            'double' => 'floatval',
61
            'boolean' => 'boolval',
62
            'bool' => 'boolval',
63
        ];
64
65
        // First, we handle booleans. We can't use a regular cast,
66
        //because PHP considers string 'false' as true.
67
        if ($value == 'false' && ($type == 'boolean' || $type == 'bool')) {
68
            return false;
69
        }
70
71
        if (isset($casts[$type])) {
72
            return $casts[$type]($value);
73
        }
74
75
        return $value;
76
    }
77
78
    /**
79
     * Normalizes the stated "type" of a parameter (eg "int", "integer", "double")
80
     * to a number of standard types (integer, boolean, float).
81
     *
82
     * @param string $type
83
     *
84
     * @return mixed|string
85
     */
86
    protected function normalizeParameterType(string $type)
87
    {
88
        $typeMap = [
89
            'int' => 'integer',
90
            'bool' => 'boolean',
91
            'double' => 'float',
92
        ];
93
94
        return $type ? ($typeMap[$type] ?? $type) : 'string';
95
    }
96
97
    /**
98
     * Allows users to specify that we shouldn't generate an example for the parameter
99
     * by writing 'No-example'.
100
     *
101
     * @param string $description
102
     *
103
     * @return bool If true, don't generate an example for this.
104
     */
105
    protected function shouldExcludeExample(string $description)
106
    {
107
        return strpos($description, ' No-example') !== false;
108
    }
109
110
    /**
111
     * Allows users to specify an example for the parameter by writing 'Example: the-example',
112
     * to be used in example requests and response calls.
113
     *
114
     * @param string $description
115
     * @param string $type The type of the parameter. Used to cast the example provided, if any.
116
     *
117
     * @return array The description and included example.
118
     */
119
    protected function parseParamDescription(string $description, string $type)
120
    {
121
        $example = null;
122
        if (preg_match('/(.*)\bExample:\s*(.+)\s*/', $description, $content)) {
123
            $description = trim($content[1]);
124
125
            // examples are parsed as strings by default, we need to cast them properly
126
            $example = $this->castToType($content[2], $type);
127
        }
128
129
        return [$description, $example];
130
    }
131
}
132