packages/sql-fixture/src/Platform/MySql/Value/ColumnGenerator.php

1<?php
2
3declare(strict_types=1);
4
5namespace SqlFixture\Platform\MySql\Value;
6
7use Faker\Generator;
8use SqlFixture\Schema\ColumnDefinition;
9
10/**
11 * Generates values from the dialect column type.
12 *
13 * @visibility root
14 */
15final class ColumnGenerator
16{
17    /**
18     * Generates value.
19     */
20    public function generateValue(Generator $faker, ColumnDefinition $column): int|float|bool|string|null
21    {
22        $type = strtoupper($column->type);
23
24        if (in_array($type, ['TINYINT', 'SMALLINT', 'MEDIUMINT', 'INT', 'INTEGER', 'BIGINT', 'FLOAT', 'DOUBLE', 'REAL', 'DECIMAL', 'NUMERIC', 'DEC', 'FIXED', 'BIT'], true)) {
25            return (new NumericGenerator())->generate($faker, $column);
26        }
27
28        if (in_array($type, ['CHAR', 'VARCHAR', 'TINYTEXT', 'TEXT', 'MEDIUMTEXT', 'LONGTEXT', 'BINARY', 'VARBINARY', 'TINYBLOB', 'BLOB', 'MEDIUMBLOB', 'LONGBLOB', 'ENUM', 'SET'], true)) {
29            return (new TextGenerator())->generate($faker, $column);
30        }
31
32        if (in_array($type, ['POINT', 'LINESTRING', 'POLYGON', 'MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRY', 'GEOMETRYCOLLECTION'], true)) {
33            return (new GeometryGenerator())->generate($faker, $column);
34        }
35
36        return match ($type) {
37
38            'DATE' => $faker->date('Y-m-d'),
39            'TIME' => $faker->time('H:i:s'),
40            'DATETIME' => $faker->dateTime()->format('Y-m-d H:i:s'),
41            'TIMESTAMP' => $faker->dateTimeBetween('1970-01-01', '2038-01-19')->format('Y-m-d H:i:s'),
42            'YEAR' => $faker->numberBetween(1901, 2155),
43
44            'JSON' => json_encode([
45                'key' => $faker->text(20),
46                'value' => $faker->numberBetween(1, 100),
47            ]),
48
49            'BOOL', 'BOOLEAN' => $faker->boolean(),
50
51            default => $faker->text(50),
52        };
53    }
54}
55