jsonschemaジェネレータを作ろうと思った
jsonschemaはつらいよ
たとえばapiのレスポンスがこんな感じだとします
正常
{
"status": {
"code": 200,
"message": "ok"
}
}
異常
{
"status": {
"code": 500,
"message": "internal server error"
},
"errors": [
{
"error_type": "unknown_error",
"error_message": "まじやばいやつ。すぐ連絡して"
}
]
}
これをjsonschemaで定義するとこうなる
{
"type": "object",
"properties": {
"status": {
"type": "object",
"properties": {
"code": { "type": "number", "description": "HTTPステータスコード" },
"message": { "type": "string" }
},
"required": ["code", "message"]
},
"errors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"error_type": { "type": "string" },
"error_message": { "type": "string" }
}
}
}
},
"required": ["status"]
}
うーん
「このIF仕様でよろしく!」ってこのjsonschemaを渡されたら死ねる...
「jsonschemaはIF仕様書ではない」て言われたら何も言えないけど、せっかくなら可読性にも配慮した書き方にしてほしいなぁ...
これを解決するには独自記法で作るしかない!
いろいろ考えましたがもうこれしかないです!
独自記法と言っても最終的にjsonschemaをはく「jsonschemaジェネレータ」ならそんなに難しくないかなと
jsonschemaジェネレータドラフト版
独自記法と言いつつjsで書く想定です
先ほどの例を独自記法でこう書きたい
object({ status: object({ code: number('HTTPステータスコード'), message: string() }), errors: array('option', map({ error_type: string(), error_message: string() })) })
設計イメージ
- 読める
- 型の指定部分をメソッドで表現する
- オプション類は引数に渡す
- パラメータの必須/任意のデフォルト値は必須にする
- 任意項目には'option'を付ける
ワクワクしてきた
まだ一行もコード書いてないけどねw