Data::Validatorでバリデーションする
はじめまして!@hisaichi5518です。就活生です。誰か雇ってください。
Text::Xatenaについて書こうと思っていたんですが、もうText::Xatenaの記事が他のトラックにあるので、今日はgfxさんによってリリースされたData::Validatorを紹介しようと思います。
Data::Validator とは
実行時型チェック / パラメーターチェックが出来る便利なモジュールです。
現在、Params::Validateがデファクトスタンダードっぽいんですが、速度が遅かったりするので正直微妙です。
ベンチマーク
p5-Data-Validator/benchmark/simple.pl
Params::Validate/0.95 Smart::Args/0.06 Data::Validator/0.06 without type constraints Rate P::Validate P::Validate/off S::Args D::Validator P::Validate 20968/s -- -1% -44% -67% P::Validate/off 21144/s 1% -- -43% -67% S::Args 37179/s 77% 76% -- -42% D::Validator 63999/s 205% 203% 72% --
Data::Validatorが抜群に早いですね。素晴らしい。これは試してみないと!!!!
というわけで試しましょう。
Data::Validatorのインストール
cpanm Data::Validator
CPANにも上がってるので簡単ですね!
Data::Validatorの使い方
use Data::Validator; my $v = Data::Validator->new( hoge => { isa => "Num" }, ); my $args = $v->validate(hoge => 123);
これまた簡単!
isaだけなら、「 hoge => "Num" 」でも大丈夫です。
例えば、以下のようにすると「Invalid value for 'hoge': Validation failed for 'Num' with value str」と怒られます。
my $args = $v->validate(hoge => "str");
isaは、Mouseのtype constraint名か任意のtype constraintオブジェクトを渡す事が出来ます。
Mouse::Util::TypeConstraintsのDefault Type Constraintsとかですね。
URIかどうか確かめたい!という時はこうします。
use Data::Validator; use MouseX::Types::URI; my $v = Data::Validator->new( uri => { isa => 'URI' } ); my $args = $v->validate(uri => 'http://example.com/');
あらまあ、簡単。
use Mouse::Util::TypeConstraints; use Data::Validator; my $MyHash = subtype 'MyHash', as 'HashRef'; coerce $MyHash, from 'ArrayRef', via { +{ @{$_} } }; my $v = Data::Validator->new( foo => $MyHash, ); $v->validate({ foo => { a => 42 } }); #=> { foo => { a => 42 } } $v->validate({ foo => [ a => 42 ] }); #=> { foo => { a => 42 } }
なんて事も出来ます。これは、テストからコピペしたんですけども。
まとめ
Data::Validatorかんたん、はやい、べんり!
これだけべた褒めしておいてなんですが、このモジュールはリリースされたばかりです。
みんなでたくさん使って、さらにいいものにしていきましょう!
「OSSは使って育てるもの。」by @__gfx__
次は、bayashiさんです!
関連リンク
Idea of Data::Validator
コンセプトとかが書かれています。
Data::Validatorの凝った使い方
ここでは説明してないメソッドwith()について書かれています。
Data::Validator
github
Data::Validator
CPAN