フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【openapi/go】ogen をつかってみた感想

を自前アプリで使ってみたので感想です。他には 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 でハンドルするだけにしている。