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