を自前アプリで使ってみたので感想です。他には oapi-codegen の仕様経験があります。
実際にコードを生成したのはこちら。 github.com
結論
oapi-codegen
よりシンプルで使いやすかった。
ただドキュメントが少ないのでいろんなことやろうと思うと試行錯誤は必要。とはいえやりたいことは大概できると思います。
次使うならまた使わせていただきます。
いい点
- 色々なファイルが生成されるが比較的読みやすいと思った
not required
なパラメータについてもポインタで管理せずに構造体で処理できた (valid: true / false を含む構造体) ので、ポインタで管理する oapi-codegen よりも使いやすかった。- enum がきちんと定義されてるし、扱いやすい関数もある。
type UserRole string const ( UserRoleRequester UserRole = "requester" UserRoleJudger UserRole = "judger" UserRoleAdmin UserRole = "admin" ) // AllValues returns all UserRole values. func (UserRole) AllValues() []UserRole { return []UserRole{ UserRoleRequester, UserRoleJudger, UserRoleAdmin, } } // MarshalText implements encoding.TextMarshaler. func (s UserRole) MarshalText() ([]byte, error) { switch s { case UserRoleRequester: return []byte(s), nil case UserRoleJudger: return []byte(s), nil case UserRoleAdmin: return []byte(s), nil default: return nil, errors.Errorf("invalid value: %q", s) } } // UnmarshalText implements encoding.TextUnmarshaler. func (s *UserRole) UnmarshalText(data []byte) error { switch UserRole(data) { case UserRoleRequester: *s = UserRoleRequester return nil case UserRoleJudger: *s = UserRoleJudger return nil case UserRoleAdmin: *s = UserRoleAdmin return nil default: return errors.Errorf("invalid value: %q", data) } }
- HTTP Request に対する parameter validator も初めから適用されていて良い
- swagger の base64 encode されたコンフリクト必至のファイルがない
戸惑ったところ
- ドキュメントは最小限(ある意味全部読んでしまいやすい)
- カスタムエラーを組み合わせたが結構ゴリ押しコードになった(まあこれはどれでも同じかも)
- handler まで来た時にはもう HTTP Request / HTTP Header などはさわれないので、触りたいときはきちんと OpenAPI 側に定義しておく必要がある(これはいいところなのかもしれない)
HandleCookieAuth
が呼び出されるためここで Cookie の検証をするのだが、普段は middleware 層でやるので戸惑った。HandleCookieAuth
をうまく呼び出せるようにする必要がある。- 既存の http server (chi / echo など) との組み合わせ方がわからなかった。ogen 生成コードだけで Server を作れるので mux でハンドルするだけにしている。