OpenAPI3.0 から Go のAPIクライアントコードを生成するライブラリ選定

# 結論
[`oapi-codegen/oapi-codegen`](https://github.com/oapi-codegen/oapi-codegen) と [`ogen-go/ogen`](https://github.com/ogen-go/ogen) がよさげ。

1ファイルのみの生成でミニマムにやりたいなら [`oapi-codegen/oapi-codegen`](https://github.com/oapi-codegen/oapi-codegen)、リクエストのクライアント検証や optional 型、gRPC っぽいインタフェースで扱いたいなら [`ogen-go/ogen`](https://github.com/ogen-go/ogen) っていう所感。

# 要件
必須
- OpenAPI3.0に対応していること
- GoのAPIクライアントコードを生成できること

推奨（＝選定観点）
- ①ライブラリとして信頼できること
- ②生成に要す時間が短いこと
- ③生成コードが必要最低限であること

# 候補
## [`OpenAPITools/openapi-generator`](https://github.com/OpenAPITools/openapi-generator)
①ライブラリとして信頼できること :thumbsup: 
- スター数は21k
- 1〜2ヶ月に一度はバージョンアップデートされ定期的にメンテナンスされている　（ただし、さまざまな言語の更新を含む）

②生成に要す時間が短いこと :thumbsup:
計測していないが1秒以内だった

```bash
❯ docker run -v ${PWD}:/local openapitools/openapi-generator-cli:v7.7.0 generate -i /local/hoge/openapi.yaml -g go -o /local/hoge/
[main] INFO  o.o.codegen.DefaultGenerator - Generating with dryRun=false
[main] INFO  o.o.c.ignore.CodegenIgnoreProcessor - No .openapi-generator-ignore file found.
[main] INFO  o.o.codegen.DefaultGenerator - OpenAPI Generator: go (client)
[main] INFO  o.o.codegen.DefaultGenerator - Generator 'go' is considered stable.
[main] INFO  o.o.c.languages.AbstractGoCodegen - Environment variable GO_POST_PROCESS_FILE not defined so Go code may not be properly formatted. To define it, try `export GO_POST_PROCESS_FILE="/usr/local/bin/gofmt -w"` (Linux/Mac)
[main] INFO  o.o.c.languages.AbstractGoCodegen - NOTE: To enable file post-processing, 'enablePostProcessFile' must be set to `true` (--enable-post-process-file for CLI).
# 中略
[main] INFO  o.o.codegen.TemplateManager - writing file /local/hoge/.openapi-generator/FILES
################################################################################
# Thanks for using OpenAPI Generator.                                          #
# Please consider donation to help us maintain this project 🙏                 #
# https://opencollective.com/openapi_generator/donate                          #
################################################################################
```

③生成コードが必要最低限であること :thumbsdown: 
APIクライアントプロジェクトとして成り立つコードが生成されるため要件にはそぐわない

```bach
.
|--.gitignore
|--.openapi-generator
|--.openapi-generator-ignore
|  |--FILES
|  |--VERSION
|--.travis.yml
|--README.md
|--api
|  |--openapi.yaml
|--client.go
|--configuration.go
|--docs
|  |-- # 中略
|--git_push.sh
|--go.mod
|--go.sum
|-- # 中略
|--response.go
|--test
|  |-- # 中略
|--utils.go
```

## [`oapi-codegen/oapi-codegen`](https://github.com/oapi-codegen/oapi-codegen)
①ライブラリとして信頼できること :thumbsup: 
- スター数は5.8k
- 数ヶ月に一度はバージョンアップデートされ定期的にメンテナンスされている

②生成に要す時間が短いこと :thumbsup: 
計測していないが1秒以内だった

```bash
❯ go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@v2.3.0
go: downloading github.com/oapi-codegen/oapi-codegen/v2 v2.3.0
go: downloading github.com/getkin/kin-openapi v0.124.0
go: downloading golang.org/x/text v0.15.0
go: downloading golang.org/x/tools v0.21.0
go: downloading github.com/invopop/yaml v0.2.0
go: downloading github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826
go: downloading github.com/go-openapi/jsonpointer v0.20.2
go: downloading github.com/perimeterx/marshmallow v1.1.5
go: downloading github.com/go-openapi/swag v0.22.8
go: downloading github.com/mailru/easyjson v0.7.7
go: downloading github.com/josharian/intern v1.0.0
go: downloading golang.org/x/mod v0.17.0

❯ oapi-codegen -config cfg.yaml hoge/openapi.yaml
```

```cfg.yaml
# yaml-language-server: $schema=https://raw.githubusercontent.com/deepmap/oapi-codegen/HEAD/configuration-schema.json
package: hoge
output: hoge/client.gen.go
generate:
  models: true
  client: true
```

model のみであれば下記

```cfg.yaml
# yaml-language-server: $schema=https://raw.githubusercontent.com/deepmap/oapi-codegen/HEAD/configuration-schema.json
package: hoge
output: hoge/only-models.gen.go
generate:
  models: true
```

③生成コードが必要最低限であること :thumbsup: 
指定したファイルのみ

```
|--client.gen.go
```

## [`ogen-go/ogen`](https://github.com/ogen-go/ogen)
①ライブラリとして信頼できること :thumbsdown: 
- スター数は1.2K
- 1〜2ヶ月に一度はバージョンアップデートされ定期的にメンテナンスされている

②生成に要す時間が短いこと :thumbsup: 
計測していないが1秒以内だった

```bash
❯ go install github.com/ogen-go/ogen/cmd/ogen@v1.3.0
go: downloading github.com/ogen-go/ogen v1.3.0
go: downloading github.com/go-faster/errors v0.7.1
go: downloading github.com/go-faster/yaml v0.4.6
go: downloading go.uber.org/zap v1.27.0
go: downloading golang.org/x/exp v0.0.0-20230725093048-515e97ebf090
go: downloading go.uber.org/multierr v1.11.0
go: downloading github.com/go-faster/jx v1.1.0
go: downloading github.com/fatih/color v1.17.0
go: downloading golang.org/x/sync v0.8.0
go: downloading golang.org/x/tools v0.24.0
go: downloading github.com/ghodss/yaml v1.0.0
go: downloading github.com/dlclark/regexp2 v1.11.4
go: downloading golang.org/x/text v0.17.0
go: downloading golang.org/x/sys v0.23.0
go: downloading golang.org/x/net v0.28.0
go: downloading github.com/segmentio/asm v1.2.0
go: downloading golang.org/x/mod v0.20.0

❯ ogen -clean -package hoge -config cfg.yaml -target . openapi.yaml
```

```cfg.yaml
generator:
  features:
    enable:
      - 'paths/client'
      - 'debug/example_tests'
    disable_all: true
```

③生成コードが必要最低限であること :thumbsup: 


```bash
.
|--oas_cfg_gen.go
|--oas_client_gen.go
|--oas_faker_gen.go
|--oas_interfaces_gen.go
|--oas_json_gen.go
|--oas_request_encoders_gen.go
|--oas_response_decoders_gen.go
|--oas_schemas_gen.go
|--oas_test_examples_gen_test.go
|--oas_validators_gen.go
```

## [`go-swagger/go-swagger`](https://github.com/go-swagger/go-swagger/tree/master)
OpenAPI3.0未対応

https://github.com/go-swagger/go-swagger/issues/1122