swaggest/go-code-builder

Go代码生成库


README

Build Status codecov Code lines Comments

此库可以生成由JSON schema定义的Go映射结构。

示例

生成代码(针对模式)。

<?php
namespace MyApp;

use Swaggest\GoCodeBuilder\JsonSchema\GoBuilder;
use Swaggest\GoCodeBuilder\JsonSchema\StructHookCallback;
use Swaggest\GoCodeBuilder\Templates\GoFile;
use Swaggest\GoCodeBuilder\Templates\Struct\StructDef;
use Swaggest\JsonSchema\Schema;

require_once __DIR__ . '/vendor/autoload.php';

$schemaData = json_decode(file_get_contents(__DIR__ . '/swagger-schema.json'));
$schema = Schema::import($schemaData);

$builder = new GoBuilder();
$builder->structCreatedHook = new StructHookCallback(function (StructDef $structDef, $path, $schema) use ($builder) {
    if ('#' === $path) {
        $structDef->setName('SwaggerSchema');
    } elseif (0 === strpos($path, '#/definitions/')) {
        $name = $builder->codeBuilder->exportableName(substr($path, strlen('#/definitions/')));
        $structDef->setName($name);
    }
});
$builder->getType($schema);

$goFile = new GoFile('swagger');
foreach ($builder->getGeneratedStructs() as $generatedStruct) {
    $goFile->getCode()->addSnippet($generatedStruct->structDef);
}
$goFile->getCode()->addSnippet($builder->getCode());

API文档

文档

模式扩展

在模式中定义的魔法属性(供应商扩展)启用特殊处理。

x-go-type

可以有一个值字符串或一个对象。包含可以用来代替生成类型的类型引用。

如果$ignoreXGoType选项为true,则忽略供应商扩展的值并生成类型。

值示例

  • "[]myorg.com/go-null-types::nulltypes.NullString"
  • "myorg.com/my-app/order.Entity"
  • "float64"
  • {"import": {"package": "my-package/domain/orders"}, "type": "Order"}
  • {"import": {"package": "my-package", "alias": "mp"}, "type": "Order"}

x-nullable, nullable

如果true,则将模式类型转换为[<type>, "null"]。需要$enableXNullable选项。

x-omitempty

一个boolean值,用于控制,omitempty的存在。

x-generate

一个boolean值,用于控制是否将属性添加到生成的struct中。具有"x-generate": false属性的将跳过。如果GoBuilder选项requireXGenerate设置为true,则仅生成具有"x-generate": true的属性。

命令行工具

您可以使用json-cli从命令行生成Go结构。