File Coverage

blib/lib/Sah/Schema/str_or_re_or_code.pm
Criterion Covered Total %
statement 3 3 100.0
branch n/a
condition n/a
subroutine 1 1 100.0
pod n/a
total 4 4 100.0


line stmt bran cond sub pod time code
1             package Sah::Schema::str_or_re_or_code;
2              
3 1     1   316969 use strict;
  1         2  
  1         345  
4              
5             our $AUTHORITY = 'cpan:PERLANCAR'; # AUTHORITY
6             our $DATE = '2024-02-06'; # DATE
7             our $DIST = 'Sah-Schemas-Str'; # DIST
8             our $VERSION = '0.018'; # VERSION
9              
10             our $schema = [any => {
11             summary => 'String, or regex (if string is of the form `/.../`), or coderef (if string is in the form of `sub { ... }`)',
12             description => <<'_',
13              
14             Either string, Regexp object, or coderef is accepted.
15              
16             If string is of the form of `/.../` or `qr(...)`, then it will be compiled into
17             a Regexp object. If the regex pattern inside `/.../` or `qr(...)` is invalid,
18             value will be rejected. Currently, unlike in normal Perl, for the `qr(...)`
19             form, only parentheses `(` and `)` are allowed as the delimiter. Currently
20             modifiers `i`, `m`, and `s` after the second `/` are allowed.
21              
22             If string matches the regex `qr/\Asub\s*\{.*\}\z/s`, then it will be eval'ed
23             into a coderef. If the code fails to compile, the value will be rejected. Note
24             that this means you accept arbitrary code from the user to execute! Please make
25             sure first and foremost that this is acceptable in your case. Currently string
26             is eval'ed in the `main` package, without `use strict` or `use warnings`.
27              
28             This schema is handy if you want to accept string or regex or coderef from the
29             command-line.
30              
31             _
32             of => [
33             ['str'],
34             ['re'],
35             ['code'],
36             ],
37              
38             prefilters => [
39             'Str::maybe_convert_to_re',
40             'Str::maybe_eval',
41             ],
42              
43             examples => [
44             {value=>'', valid=>1},
45             {value=>'a', valid=>1},
46             {value=>{}, valid=>0, summary=>'Not a string'},
47              
48             # re
49             {value=>'//', valid=>1, validated_value=>qr//},
50             {value=>'/foo', valid=>1, summary=>'Becomes a string'},
51             {value=>'qr(foo', valid=>1, summary=>'Becomes a string'},
52             {value=>'qr(foo(', valid=>1, summary=>'Becomes a string'},
53             {value=>'qr/foo/', valid=>1, summary=>'Becomes a string'},
54              
55             {value=>'/foo.*/', valid=>1, validated_value=>qr/foo.*/},
56             {value=>'qr(foo.*)', valid=>1, validated_value=>qr/foo.*/},
57             {value=>'/foo/is', valid=>1, validated_value=>qr/foo/is},
58             {value=>'qr(foo)is', valid=>1, validated_value=>qr/foo/is},
59              
60             {value=>'/foo[/', valid=>0, summary=>'Invalid regex'},
61              
62             # code
63             {value=>'sub {}', valid=>1, code_validate=>sub { ref($_[0]) eq 'CODE' & !defined($_[0]->()) }},
64             {value=>'sub{"foo"}', valid=>1, code_validate=>sub { ref($_[0]) eq 'CODE' && $_[0]->() eq 'foo' }},
65             {value=>'sub {', valid=>1, summary=>'Becomes a string'},
66              
67             {value=>'sub {1=2}', valid=>0, summary=>'Code does not compile'},
68             ],
69              
70             }];
71              
72             1;
73             # ABSTRACT:
74              
75             __END__