Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm |
Statements | Executed 1437 statements in 10.9ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
63 | 1 | 1 | 1.81ms | 16.7ms | _eval_keyword_format | JSON::Schema::Modern::Vocabulary::FormatAssertion::
63 | 1 | 1 | 1.21ms | 6.38ms | __ANON__[:132] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
63 | 1 | 1 | 208µs | 208µs | _get_default_format_validation | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 29µs | 36µs | BEGIN@16 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 26µs | 29µs | BEGIN@1.313 | Module::Runtime::
1 | 1 | 1 | 16µs | 42µs | BEGIN@13 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 12µs | 784µs | BEGIN@11 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 12µs | 26µs | BEGIN@14 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 10µs | 10µs | BEGIN@9 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 8µs | 17µs | BEGIN@15 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 8µs | 28µs | BEGIN@18 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 7µs | 214µs | BEGIN@10 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 7µs | 182µs | BEGIN@19 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 6µs | 105µs | BEGIN@12 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 6µs | 77µs | BEGIN@17 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 5µs | 37µs | BEGIN@2.314 | Module::Runtime::
1 | 1 | 1 | 2µs | 2µs | keywords | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 2µs | 2µs | vocabulary | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:101] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:117] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:121] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:124] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:125] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:126] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:127] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:128] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:130] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:134] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:135] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:38] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:41] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:44] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:47] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:51] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:77] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:78] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:96] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:97] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | __ANON__[:98] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | _traverse_keyword_format | JSON::Schema::Modern::Vocabulary::FormatAssertion::
0 | 0 | 0 | 0s | 0s | evaluation_order | JSON::Schema::Modern::Vocabulary::FormatAssertion::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | 2 | 26µs | 2 | 32µs | # spent 29µs (26+3) within Module::Runtime::BEGIN@1.313 which was called:
# once (26µs+3µs) by Module::Runtime::require_module at line 1 # spent 29µs making 1 call to Module::Runtime::BEGIN@1.313
# spent 3µs making 1 call to strict::import |
2 | 2 | 36µs | 2 | 69µs | # spent 37µs (5+32) within Module::Runtime::BEGIN@2.314 which was called:
# once (5µs+32µs) by Module::Runtime::require_module at line 2 # spent 37µs making 1 call to Module::Runtime::BEGIN@2.314
# spent 32µs making 1 call to warnings::import |
3 | package JSON::Schema::Modern::Vocabulary::FormatAssertion; | ||||
4 | # vim: set ts=8 sts=2 sw=2 tw=100 et : | ||||
5 | # ABSTRACT: Implementation of the JSON Schema Format-Assertion vocabulary | ||||
6 | |||||
7 | 1 | 1µs | our $VERSION = '0.558'; | ||
8 | |||||
9 | 2 | 26µs | 1 | 10µs | # spent 10µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@9 which was called:
# once (10µs+0s) by Module::Runtime::require_module at line 9 # spent 10µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@9 |
10 | 2 | 21µs | 2 | 421µs | # spent 214µs (7+207) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@10 which was called:
# once (7µs+207µs) by Module::Runtime::require_module at line 10 # spent 214µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@10
# spent 207µs making 1 call to Moo::import |
11 | 3 | 48µs | 3 | 1.55ms | # spent 784µs (12+772) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@11 which was called:
# once (12µs+772µs) by Module::Runtime::require_module at line 11 # spent 784µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@11
# spent 757µs making 1 call to strictures::import
# spent 14µs making 1 call to strictures::VERSION |
12 | 2 | 34µs | 2 | 204µs | # spent 105µs (6+99) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@12 which was called:
# once (6µs+99µs) by Module::Runtime::require_module at line 12 # spent 105µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@12
# spent 99µs making 1 call to experimental::import |
13 | 2 | 28µs | 2 | 45µs | # spent 42µs (16+26) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@13 which was called:
# once (16µs+26µs) by Module::Runtime::require_module at line 13 # spent 42µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@13
# spent 3µs making 1 call to if::import |
14 | 2 | 18µs | 2 | 26µs | # spent 26µs (12+14) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@14 which was called:
# once (12µs+14µs) by Module::Runtime::require_module at line 14 # spent 26µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@14
# spent 0s making 1 call to if::unimport |
15 | 2 | 15µs | 2 | 18µs | # spent 17µs (8+9) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@15 which was called:
# once (8µs+9µs) by Module::Runtime::require_module at line 15 # spent 17µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@15
# spent 1µs making 1 call to if::unimport |
16 | 2 | 15µs | 2 | 36µs | # spent 36µs (29+7) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@16 which was called:
# once (29µs+7µs) by Module::Runtime::require_module at line 16 # spent 36µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@16
# spent 0s making 1 call to if::unimport |
17 | 2 | 15µs | 2 | 148µs | # spent 77µs (6+71) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@17 which was called:
# once (6µs+71µs) by Module::Runtime::require_module at line 17 # spent 77µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@17
# spent 71µs making 1 call to Exporter::import |
18 | 2 | 17µs | 2 | 48µs | # spent 28µs (8+20) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@18 which was called:
# once (8µs+20µs) by Module::Runtime::require_module at line 18 # spent 28µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@18
# spent 20µs making 1 call to Feature::Compat::Try::import |
19 | 2 | 1.80ms | 2 | 357µs | # spent 182µs (7+175) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@19 which was called:
# once (7µs+175µs) by Module::Runtime::require_module at line 19 # spent 182µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@19
# spent 175µs making 1 call to namespace::clean::import |
20 | |||||
21 | 1 | 1µs | 1 | 396µs | with 'JSON::Schema::Modern::Vocabulary'; # spent 396µs making 1 call to Moo::with |
22 | |||||
23 | # spent 2µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::vocabulary which was called:
# once (2µs+0s) by JSON::Schema::Modern::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern.pm:700] at line 696 of JSON/Schema/Modern.pm | ||||
24 | 1 | 4µs | 'https://json-schema.org/draft/2020-12/vocab/format-assertion' => 'draft2020-12'; | ||
25 | } | ||||
26 | |||||
27 | sub evaluation_order { 3 } | ||||
28 | |||||
29 | # spent 2µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::keywords which was called:
# once (2µs+0s) by JSON::Schema::Modern::_eval_subschema at line 563 of JSON/Schema/Modern.pm | ||||
30 | 1 | 3µs | qw(format); | ||
31 | } | ||||
32 | |||||
33 | { | ||||
34 | # for now, all built-in formats are constrained to the 'string' type | ||||
35 | |||||
36 | my $is_datetime = sub { | ||||
37 | eval { Time::Moment->from_string(uc($_[0])) } ? 1 : 0, | ||||
38 | 1 | 1µs | }; | ||
39 | my $is_email = sub { | ||||
40 | Email::Address::XS->parse($_[0])->is_valid; | ||||
41 | 1 | 0s | }; | ||
42 | my $is_hostname = sub { | ||||
43 | Data::Validate::Domain::is_domain($_[0]); | ||||
44 | 1 | 0s | }; | ||
45 | my $idn_decode = sub { | ||||
46 | try { return Net::IDN::Encode::domain_to_ascii($_[0]) } catch ($e) { return $_[0]; } | ||||
47 | 1 | 1µs | }; | ||
48 | my $is_ipv4 = sub { | ||||
49 | my @o = split(/\./, $_[0], 5); | ||||
50 | @o == 4 && (grep /^(?:0|[1-9][0-9]{0,2})$/, @o) == 4 && (grep $_ < 256, @o) == 4; | ||||
51 | 1 | 1µs | }; | ||
52 | # https://tools.ietf.org/html/rfc3339#appendix-A with some additions for the 2000 version | ||||
53 | # as defined in https://en.wikipedia.org/wiki/ISO_8601#Durations | ||||
54 | 1 | 1µs | my $duration_re = do { | ||
55 | 1 | 5µs | 1 | 2µs | my $num = qr{[0-9]+(?:[.,][0-9]+)?}; # spent 2µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
56 | 1 | 24µs | 2 | 19µs | my $second = qr{${num}S}; # spent 19µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 0s making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
57 | 1 | 11µs | 2 | 7µs | my $minute = qr{${num}M}; # spent 7µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 0s making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
58 | 1 | 42µs | 2 | 38µs | my $hour = qr{${num}H}; # spent 38µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 0s making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
59 | 1 | 27µs | 2 | 23µs | my $time = qr{T(?=[0-9])(?:$hour)?(?:$minute)?(?:$second)?}; # spent 23µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 0s making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
60 | 1 | 11µs | 2 | 8µs | my $day = qr{${num}D}; # spent 7µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 1µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
61 | 1 | 9µs | 2 | 7µs | my $month = qr{${num}M}; # spent 6µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 1µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
62 | 1 | 19µs | 2 | 15µs | my $year = qr{${num}Y}; # spent 15µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 0s making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
63 | 1 | 53µs | 2 | 6µs | my $week = qr{${num}W}; # spent 6µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 0s making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
64 | 1 | 26µs | 2 | 22µs | my $date = qr{(?=[0-9])(?:$year)?(?:$month)?(?:$day)?}; # spent 21µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 1µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
65 | 1 | 57µs | 2 | 49µs | qr{^P(?:(?=.)(?:$date)?(?:$time)?|$week)$}; # spent 48µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 1µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
66 | }; | ||||
67 | |||||
68 | my $formats = +{ | ||||
69 | 'date-time' => sub { | ||||
70 | $is_datetime->($_[0]) || ( | ||||
71 | $_[0] =~ m/^(?:\d{4}-\d\d-\d\dT\d\d:\d\d):(\d\d)(?:\.\d+)?(?:[Zz]|[+-]\d\d:\d\d)$/a | ||||
72 | && $1 eq '60' | ||||
73 | && do { | ||||
74 | require DateTime::Format::RFC3339; | ||||
75 | eval { DateTime::Format::RFC3339->parse_datetime($_[0]) }; | ||||
76 | }); | ||||
77 | }, | ||||
78 | date => sub { $_[0] =~ /^\d{4}-(?:\d\d)-(?:\d\d)$/a && $is_datetime->($_[0].'T00:00:00Z') }, | ||||
79 | time => sub { | ||||
80 | return if $_[0] !~ /^(\d\d):(\d\d):(\d\d)(?:\.\d+)?([Zz]|([+-])(\d\d):(\d\d))$/a | ||||
81 | or $1 > 23 | ||||
82 | or $2 > 59 | ||||
83 | or $3 > 60 | ||||
84 | or (defined($6) and $6 > 23) | ||||
85 | or (defined($7) and $7 > 59); | ||||
86 | |||||
87 | return 1 if $3 <= 59; | ||||
88 | return $1 == 23 && $2 == 59 if uc($4) eq 'Z'; | ||||
89 | |||||
90 | my $sign = $5 eq '+' ? 1 : -1; | ||||
91 | my $hour_zulu = $1 - $6*$sign; | ||||
92 | my $min_zulu = $2 - $7*$sign; | ||||
93 | $hour_zulu -= 1 if $min_zulu < 0; | ||||
94 | |||||
95 | return $hour_zulu%24 == 23 && $min_zulu%60 == 59; | ||||
96 | }, | ||||
97 | duration => sub { $_[0] =~ $duration_re && $_[0] !~ m{[.,][0-9]+[A-Z].} }, | ||||
98 | email => sub { $is_email->($_[0]) && $_[0] !~ /[^[:ascii:]]/ }, | ||||
99 | 'idn-email' => $is_email, | ||||
100 | hostname => $is_hostname, | ||||
101 | 'idn-hostname' => sub { $is_hostname->($idn_decode->($_[0])) }, | ||||
102 | ipv4 => $is_ipv4, | ||||
103 | ipv6 => sub { | ||||
104 | ($_[0] =~ /^(?:[[:xdigit:]]{0,4}:){0,7}[[:xdigit:]]{0,4}$/ | ||||
105 | || $_[0] =~ /^(?:[[:xdigit:]]{0,4}:){1,6}((?:[0-9]{1,3}\.){3}[0-9]{1,3})$/ | ||||
106 | && $is_ipv4->($1)) | ||||
107 | && $_[0] !~ /:::/ | ||||
108 | && $_[0] !~ /^:[^:]/ | ||||
109 | && $_[0] !~ /[^:]:$/ | ||||
110 | && do { | ||||
111 | my $double_colons = ()= ($_[0] =~ /::/g); | ||||
112 | my $colon_components = grep length, split(/:+/, $_[0], -1); | ||||
113 | $double_colons < 2 && ($double_colons > 0 | ||||
114 | || ($colon_components == 8 && !defined $1) | ||||
115 | || ($colon_components == 7 && defined $1)) | ||||
116 | }; | ||||
117 | }, | ||||
118 | uri => sub { | ||||
119 | my $uri = Mojo::URL->new($_[0]); | ||||
120 | fc($uri->to_unsafe_string) eq fc($_[0]) && $uri->is_abs && $_[0] !~ /[^[:ascii:]]/; | ||||
121 | }, | ||||
122 | 'uri-reference' => sub { | ||||
123 | fc(Mojo::URL->new($_[0])->to_unsafe_string) eq fc($_[0]) && $_[0] !~ /[^[:ascii:]]/; | ||||
124 | }, | ||||
125 | iri => sub { Mojo::URL->new($_[0])->is_abs }, | ||||
126 | uuid => sub { $_[0] =~ /^[[:xdigit:]]{8}-(?:[[:xdigit:]]{4}-){3}[[:xdigit:]]{12}$/ }, | ||||
127 | 'json-pointer' => sub { (!length($_[0]) || $_[0] =~ m{^/}) && $_[0] !~ m{~(?![01])} }, | ||||
128 | 'relative-json-pointer' => sub { $_[0] =~ m{^(?:0|[1-9][0-9]*)(?:#$|$|/)} && $_[0] !~ m{~(?![01])} }, | ||||
129 | # spent 6.38ms (1.21+5.17) within JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:132] which was called 63 times, avg 101µs/call:
# 63 times (1.21ms+5.17ms) by JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format at line 182, avg 101µs/call | ||||
130 | 63 | 373µs | local $SIG{__WARN__} = sub { die @_ }; | ||
131 | 189 | 6.10ms | 126 | 5.17ms | eval { qr/$_[0]/; 1 ? 1 : 0 }; # spent 5.07ms making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp, avg 80µs/call
# spent 100µs making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr, avg 2µs/call |
132 | }, | ||||
133 | |||||
134 | 'iri-reference' => sub { 1 }, | ||||
135 | 'uri-template' => sub { 1 }, | ||||
136 | 1 | 18µs | }; | ||
137 | |||||
138 | 189 | 77µs | # spent 208µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::_get_default_format_validation which was called 63 times, avg 3µs/call:
# 63 times (208µs+0s) by JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format at line 173, avg 3µs/call | ||
139 | 63 | 196µs | return $formats->{$format}; | ||
140 | } | ||||
141 | } | ||||
142 | |||||
143 | 1 | 0s | sub _traverse_keyword_format ($self, $schema, $state) { | ||
144 | return if not assert_keyword_type($state, $schema, 'string'); | ||||
145 | return 1; | ||||
146 | } | ||||
147 | |||||
148 | 315 | 95µs | # spent 16.7ms (1.81+14.9) within JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format which was called 63 times, avg 265µs/call:
# 63 times (1.81ms+14.9ms) by JSON::Schema::Modern::_eval_subschema at line 578 of JSON/Schema/Modern.pm, avg 265µs/call | ||
149 | abort($state, 'unimplemented format "%s"', $schema->{format}) | ||||
150 | 63 | 42µs | if $schema->{format} eq 'uri-template'; | ||
151 | |||||
152 | 63 | 56µs | try { | ||
153 | 63 | 242µs | if ($schema->{format} eq 'date-time' or $schema->{format} eq 'date') { | ||
154 | require Time::Moment; | ||||
155 | } | ||||
156 | elsif ($schema->{format} eq 'email' or $schema->{format} eq 'idn-email') { | ||||
157 | require Email::Address::XS; Email::Address::XS->VERSION(1.04); | ||||
158 | } | ||||
159 | elsif ($schema->{format} eq 'hostname' or $schema->{format} eq 'idn-hostname') { | ||||
160 | require Data::Validate::Domain; | ||||
161 | } | ||||
162 | elsif ($schema->{format} eq 'idn-hostname') { | ||||
163 | require Net::IDN::Encode; | ||||
164 | } | ||||
165 | } | ||||
166 | catch ($e) { | ||||
167 | return E($state, 'cannot validate format "%s": %s', $schema->{format}, $e); | ||||
168 | } | ||||
169 | |||||
170 | # first check the subrefs from JSON::Schema::Modern->new(format_evaluations => { ... }) | ||||
171 | # and add in the type if needed | ||||
172 | 63 | 206µs | 63 | 2.32ms | my $evaluator_spec = $state->{evaluator}->_get_format_validation($schema->{format}); # spent 2.32ms making 63 calls to JSON::Schema::Modern::_get_format_validation, avg 37µs/call |
173 | 63 | 181µs | 63 | 208µs | my $default_spec = $self->_get_default_format_validation($schema->{format}); # spent 208µs making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::_get_default_format_validation, avg 3µs/call |
174 | |||||
175 | 63 | 145µs | my $spec = | ||
176 | $evaluator_spec ? ($default_spec ? +{ type => 'string', sub => $evaluator_spec } : $evaluator_spec) | ||||
177 | : $default_spec ? +{ type => 'string', sub => $default_spec } | ||||
178 | : undef; | ||||
179 | |||||
180 | 63 | 109µs | 63 | 5.18ms | A($state, $schema->{format}); # spent 5.18ms making 63 calls to JSON::Schema::Modern::Utilities::A, avg 82µs/call |
181 | return E($state, 'not a%s %s', $schema->{format} =~ /^[aeio]/ ? 'n' : '', $schema->{format}) | ||||
182 | 63 | 257µs | 126 | 7.20ms | if $spec and is_type($spec->{type}, $data) and not $spec->{sub}->($data); # spent 6.38ms making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:132], avg 101µs/call
# spent 820µs making 63 calls to JSON::Schema::Modern::Utilities::is_type, avg 13µs/call |
183 | |||||
184 | 63 | 317µs | return 1; | ||
185 | } | ||||
186 | |||||
187 | 1 | 20µs | 1; | ||
188 | |||||
189 | 1 | 45µs | 1 | 324µs | __END__ # spent 324µs making 1 call to B::Hooks::EndOfScope::XS::__ANON__[B/Hooks/EndOfScope/XS.pm:26] |