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