rubyでjson-schema
というのがあったのだが、あまりマネジメントされているように見えず(既に完成されてるならいいんだが判断つかず)、さらに「そんなにすごいものじゃなくていい」ので、必要な部分だけを簡易に再実装した。
しかも常にraise exceptionするという乱暴な感じで。
結果的に本体部分の処理は40行くらいで、認識する型の設定部分をいれても60行くらいで簡単に書けた。テストは書いてないが、、、
チップスとしては、
case文のときに===判定であることを初めて知り、
code:ruby
type = Integer
p type == Integer # => true
p type === Integer # => false
という状態にちょっと手間取って、if文にした。
また、rubyにはBooleanがなくて、TrueClassとFalseClassのunion型として解決しなければならなかったことも知りませんでした。
で、使い方的には、
code:yaml
type: "hash"
required:
- "users"
- "photo_ids"
properties:
users:
type: "hash"
required:
- "id"
- "name"
properties:
id: "integer"
name: "string"
is_child: "boolean"
photo_ids:
type: "array"
items:
type: "integer"
みたいなyamlを認識して、hashに関しては再帰的に、arrayに関してはループ的に処理します。
こういうのってjsonbuilderとかでもできるのかどうかとかもよくわからなかったのだが、マジで大したことしてないからさっさと作っちまうというのでもいい気はしています。どうもOSSとかgemになると「大げさなくらいでかい」みたいな感じになりがちなので。。。buildとかのときも、予期せぬ依存関係とかあって本体アップデートできず、とかもいやだ、という軽い気持ちで今回書いてみました。
ただまぁちゃんとテスト書いておかないと、確かに「ちょっと拡張したときや、あんまり使ってなかった設定をしたときに、当然動くと思っていたのがエラーになった」とかでマジでストレスになるだろうから、痛し痒しというか、まぁgem使ってもいいとは思うのですが。それでもそのとき「直す」という選択肢を頭に常に入れておくことはいいことだとは思います。
下記実装例。
思ったんだけど、scrapboxはやっぱりコード書くには面倒なので、gistにした。