go-openapi を書き直しています


2 min read
go-openapi を書き直しています

本記事はGo2 Advent Calendarの20日目の記事です。昨日はyaegashiさんによる、jsonx.goでした。

皆さんはOpenAPI Specificationというモノをご存じでしょうか。OpenAPI SpecificationはJSONまたはYAMLでREST APIを表現するための仕様で、現在バージョン3.0.2が最新です。いわゆるSwaggerの後継で、バージョン1系、2系がSwagger、3系以降がOpenAPI、ということになっています(Swaggerなら聞いたことがある/使っているという人も多いのではないでしょうか)。

OpenAPI Specificationは人間にも機械にも(比較的)読みやすい仕様書として、コード生成や、ドキュメントページの生成に使用することが可能です。

個人的には専らコード生成に使用しており、Go言語向けの実装としてgithub.com/nasa9084/go-openapi(以下go-openapi)を実装・公開しています。
go-openapiは2017年ごろから細々と実装を続けており、(多分)二番目か三番目には古いと思われるOpenAPIのGo実装です。

基本的にはただひたすらOpenAPIのオブジェクトをGoの構造体として定義、値のバリデーション関数を用意しているといったもので、特別な機能はほとんどありません。
YAMLのパーサも、go-yaml/yamlを使用しており、自前では実装していません。

そんな中、@goccyさんが、encoding/jsonとコンパチなインターフェースを持ったYAMLパーサを開発した、という話を耳にし、これを機に、とgo-openapiの実装を一から書き直し始めました。
もともと、パースは完全にgo-yaml/yamlに依存しており、Unmarshal系のメソッドも実装していなかった(途中から全部書くのはつらかったので・・・)ため、一部バリデーションに必要な関数を埋め込んだりもできなかったので、書き直したいとは思っていたのです。

現時点ではまだマージしておらず、書いている途中なのですが、大きな変更点として次の様なものがあります。

  • もともとパブリックだったフィールドをすべてプライベートに変更し、ゲッターをはやした
  • 各構造体に対応するUnmarshalYAML()メソッドをすべてコード生成するようにした
  • YAMLパーサはgithub.com/goccy/go-yamlに乗り換えた
  • rootオブジェクトを各構造体に埋め込むことで、バリデーションをとりやすくした

今後はよりコード生成に便利なメソッドを追加していきたいと思っています。

時間の都合で今日はここまで。技術的な話が全然無い記事になってしまった・・・


builderscon tokyo 2020やるぞ!という話
Previous article

builderscon tokyo 2020やるぞ!という話

buildersconは「知らなかった、を聞く」あるいは英語で "Discover Something New"をスローガンとした、IT技術者向けの技術カンファレンスです。2016年、2017年、2018年、2019年と@lestrratさんが主催として開催してきて、私もコアスタッフとして関わってきました。 そんなbuildersconですが、2020年は子育てで多忙な@lestrratさんに代わり、私(@nasa9084)が主催として開催に向けて準備を進めていくことになりました! まぁ、今のところはやるぞ!

趣味サーバーのインフラを再構成した件
Next article

趣味サーバーのインフラを再構成した件

明けましておめでとうございます。 本年もどうぞよろしくお願いいたします。 扨、もう一昨年になりますが、趣味サーバーのインフラをKubernetesで整えた件という記事を投稿しました。 その後紆余曲折ございまして、これらを再構成しましたので、改めて記録に残しておこうと思います。 紆余曲折 まずは紆余曲折とは?という話から始めましょう。 当時、Kubernetes用のPersistent VolumeはGlusterFSを使用していました。最初はこれで問題なかったのですが、一部のアプリケーション(具体的にはRedmine)を動かしていく上で、非常に速度が遅い、ということが問題となりました。 調査の上、どうやら遅い原因がGlusterFSであり、Cephに置き換えることである程度速度を改善することができそうだ、という見込みが立ったため、前述の記事を投稿してから約二ヶ月後にGlusterFSをCeph


Related Articles

Getting Started Golang/WebAssembly
4 min read

2019年の振り返り

‌ 2020年に入って早1週間が経過しましたが、皆様いかがお過ごしでしょうか。 一年の振り返り!みたいのはあんまりやるつもりがなかったのですが、あまりにもみんなやっていて目につくので、これはやった方が良い物なのか・・・と思い直し、遅ればせながら振り返ってみようかと思います。 1月そういえば2018年振り返りみたいなブログ書いてないんですが、2019年は心おだやかに生きたいと思っております — nasa9084@某某某某(0x1a) (@nasa9084) January 3, 2019 twitterによると、2019年は心おだやかに生きたいというのが目標だった様子。

2 min read
net/http.ClientにHookをかける
3 min read

GO TOP

🎉 You've successfully subscribed to something tech.!
OK