Open19

goで補完付きの設定ファイルを作りたい

podhmopodhmo

設定ファイル中で設定可能なオプションなどが分からないときの試行錯誤がめんどくさい。補完が効くような設定ファイルを考えてみたい。

幾つか考えることがある

  • 補完可能な設定ファイルのフォーマットを見つける
  • 補完可能にするために必要な情報を整理する
  • いい感じに補完可能にするための記述を考える
podhmopodhmo

補完可能な設定ファイルのフォーマットを見つける

例えば設定ファイルとして使えるフォーマットとして以下があげられる

  • .json
  • (.jsonc)
  • .yaml
  • .toml
  • (.env)

すごくマイナーではあるけれど以下のようなものは?

  • cue
  • jsonnet
podhmopodhmo

基本的にlanguage serverが対応していれば補完可能?

toml

Even Better TOML - Visual Studio Marketplace

https://github.com/tamasfe/taplo

jsonschemaを持っている。これがlocalで参照できれば良い。

#:schema ./foo-schema.json
foo = "bar"

draft 4が使われているみたい

https://taplo.tamasfe.dev/configuration/developing-schemas.html#writing-schemas

All features from the Draft 4 specification are supported, the schemas may contain external and even recursive references as well.

examplesはdraft-7

これが使われている。draft-4にこだわらなくて良さそう。

https://github.com/Stranger6667/jsonschema-rs

podhmopodhmo

yaml

YAML - Visual Studio Marketplace

https://github.com/redhat-developer/vscode-yaml

コメントで設定するらしい

# yaml-language-server: $schema=<urlToTheSchema>

一応draft 7までいける?

YAML Language support uses JSON Schemas to understand the shape of a YAML file, including its value sets, defaults and descriptions. The schema support is shipped with JSON Schema Draft 7.

追記

ajvが使われているし、draft-2020-12にも対応していそう。

https://github.com/redhat-developer/yaml-language-server/blob/bddfbffae80da6694a3a5be626b7b110e44a6e16/package.json#L36

podhmopodhmo

json

jsonはコメントがなさそう。設定できないのでは?

podhmopodhmo
podhmopodhmo

補完可能にするために必要な情報を整理する

  • config.go
  • jsonschema
  • 設定ファイルのskeleton (schemaのコメントがついた空のファイル?)
podhmopodhmo

いい感じに補完可能にするための記述を考える

gosで定義してgo generateで生成すれば良い?

https://github.com/podhmo/gos/issues/81

  • goのファイルを生成
  • jsonschemaを生成
  • confのskeletonを生成? (consoleに出力で良いのでは?)
podhmopodhmo

現状のmetadata付きのbuilderは余計な気がする。もっとシンプルなもので十分。
config自体はパッケージ毎に個別に定義したいことがあるんだろうか(これは一旦忘れる)
とりあえずjsonschemaとgoのファイルが生成されれば良い気がする。

jsonschemaは手書きしたくない。

podhmopodhmo

生成されるgoのコード

とりあえず、シンプルなものを考えてみるその後どうしようか?

  • structを出力
  • slices,mapの対応
  • tagsの出力 (json,toml,yaml)
  • omitempty対応
  • pointer対応
  • embeddedの対応

あと、

  • 個別に出力できる必要がある?
podhmopodhmo

jsonschemaだけでなくgoのコード生成でもseenは使いたくなる。
結局のところseen自体は別のstructに保持すべきものなのではないか?

podhmopodhmo

出力方法

  • marker comment越しに変換
  • stdoutに出力
  • 複数のファイルに分割して出力
podhmopodhmo

oapi-codegenなどの設定ファイルのjsonschemaを生成する

例えば、oapi-codegenのConfigは以下にあるがどのようなオプションが存在するのか不明瞭(いちいち.goを見に行くのがめんどくさい。たまにtypoをしてしまい動かないことが存在する)

https://github.com/deepmap/oapi-codegen/blob/d26d251362ce50640ca4f418eb4922cfb1757856/pkg/codegen/configuration.go#L14