動的な型制約の応用例
前節までで,
アプリケーションの仕様を型として定義する
アプリケーションには,
リスト3は,public
か非公開を表すprivate
のどちらかであると定義しています。update_
に変なデータを渡したとしても,
リスト3 仕様を型として定義する
package Blog;
use Smart::Args;
use Mouse::Util::TypeConstraints;
subtype 'Blog::Title', ┓
=> as 'Str' ┃
=> where { ┃
3 <= length($_) && length($_) <= 100; ┃
} ┣(1)
=> message { ┃
"$_ is not valid blog title"; ┃
}; ┛
enum 'Blog::Status' => [qw(public private)]; ━(2)
sub update_blog { ┓
args my $class => 'ClassName', ┃
my $blog_id => 'Int', ┃
my $title => 'Blog::Title', ┣(3)
my $status => 'Blog::Status'; ┃
# 渡されたデータでのブログデータの更新処理 ┃
... ┃
} ┛
この例のように,
型制約でユーザーの入力を制限する
先ほど,
型制約を満たすかどうかを真偽値で取得できれば,find_
という型を取得するユーティリティがあり,
次のコードは,Blog::Title
型とfind_
を利用して,
use Mouse::Util::TypeConstraints;
my $input = ...;
my $is_valid = find_type_constraint('Blog::Title')-
>check($input); ━(1)
if (!$is_valid) {
# ユーザーにエラーメッセージを返す
}
$input
がBlog::Title
型を満たすなら真が,$is_
に代入されます。偽の場合にユーザーにフィードバックを返せば,