[ "name" => trim($name), "type" => trim($type), "docs" => trim($docs), "default" => $default, ], ]; }, $d); return array_merge(...$d); }, $fields); $classes = array_combine($names, $fields); ksort($classes); $files = []; // This is not the prettiest way to generate the codes, but it works. foreach ($classes as $className => $vars) { // Get name of the class from filename and split CamelCase to words. $classNameString = $className; $classNameString = str_replace("Bis", "", $classNameString); $classNameString = preg_replace('/(? $varData) { if (in_array($varKey, $used, true)) { continue; } $caster = ""; if (str_contains($varData["type"], "[")) { $classType = str_replace(["[", "]", "?"], "", $varData["type"]); $caster = "\n #[CastWith(Casters\ArrayCaster::class, itemType: $classType::class)]"; } $type = $varData["type"]; $typeHelper = ""; if (str_contains($type, "[")) { $type = str_contains($type, "?") ? "?array" : "array"; $typeHelper = "\n * @var {$varData["type"]} \${$varData["name"]}"; } $default = $varData["default"] !== null ? " = " . $varData["default"] . ";" : ";"; $file .= " /** * {$varData["docs"]}{$typeHelper} */{$caster} public $type \${$varData["name"]}{$default} "; } $file .= "}\n"; $files[$className] = $file; } if (!empty($files)) { echo "Generating files:\n"; $dtoDir = sprintf('%s%s%s%s%s', dirname(__FILE__, 2), DS, 'src', DS, 'Dto'); foreach ($files as $className => $file) { $filePath = sprintf('%s%s%s.php', $dtoDir, DS, $className); echo $filePath . "\n"; file_put_contents($filePath, $file); } }