dry-validationで設定ファイルを検証する
Rubyでちょっとしたツールを作ったとき、設定ファイルの検証にdry-validationを使ってたら便利だった。
こんな感じのYAML形式の設定ファイルがあったとする。
database:
host: localhost
port: 80
この設定ファイルのスキーマをDSLを使って定義できる。
class ConfigContract < Dry::Validation::Contract
json do
required(:database).hash do
required(:host).value(:string)
required(:port).value(:integer)
end
end
rule(database: :host) do
key.failure("must not be localhost") if value == "localhost"
end
rule(database: :port) do
key.failure("must not use well-known port") if value < 1024
end
end
このスキーマを使って設定ファイルを検証してみる。
config = YAML.load_file("./config.yml")
result = ConfigContract.new.call(config)
puts result.errors.to_h
#=> {:database=>{:host=>["must not be localhost"], :port=>["must not use well-known port"]}}
DSLについてはdry-validationやdry-schemaのドキュメントを眺めたり、ドキュメントにないDSLはソースコードを眺めてみるといい。