Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm |
Statements | Executed 1374 statements in 7.96ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
73 | 11 | 1 | 2.13ms | 2.13ms | CORE:regcomp (opcode) | JSON::Schema::Modern::Vocabulary::FormatAssertion::
63 | 1 | 1 | 1.62ms | 25.7ms | _eval_keyword_format | JSON::Schema::Modern::Vocabulary::FormatAssertion::
63 | 1 | 1 | 1.01ms | 3.07ms | __ANON__[:132] | JSON::Schema::Modern::Vocabulary::FormatAssertion::
63 | 1 | 1 | 175µs | 175µs | _get_default_format_validation | JSON::Schema::Modern::Vocabulary::FormatAssertion::
74 | 12 | 1 | 87µs | 87µs | CORE:qr (opcode) | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 46µs | 50µs | BEGIN@1.312 | Module::Runtime::
1 | 1 | 1 | 40µs | 72µs | BEGIN@13 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 33µs | 55µs | BEGIN@14 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 30µs | 1.21ms | BEGIN@11 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 15µs | 95µs | BEGIN@17 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 15µs | 402µs | BEGIN@19 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 15µs | 15µs | BEGIN@9 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 14µs | 30µs | BEGIN@15 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 12µs | 193µs | BEGIN@12 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 10µs | 30µs | BEGIN@16 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 10µs | 44µs | BEGIN@18 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 10µs | 50µs | BEGIN@2.313 | Module::Runtime::
1 | 1 | 1 | 8µs | 285µs | BEGIN@10 | JSON::Schema::Modern::Vocabulary::FormatAssertion::
1 | 1 | 1 | 3µs | 3µ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 | 49µs | 2 | 54µs | # spent 50µs (46+4) within Module::Runtime::BEGIN@1.312 which was called:
# once (46µs+4µs) by Module::Runtime::require_module at line 1 # spent 50µs making 1 call to Module::Runtime::BEGIN@1.312
# spent 4µs making 1 call to strict::import |
2 | 2 | 57µs | 2 | 90µs | # spent 50µs (10+40) within Module::Runtime::BEGIN@2.313 which was called:
# once (10µs+40µs) by Module::Runtime::require_module at line 2 # spent 50µs making 1 call to Module::Runtime::BEGIN@2.313
# spent 40µ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 | 0s | our $VERSION = '0.556'; | ||
8 | |||||
9 | 2 | 41µs | 1 | 15µs | # spent 15µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@9 which was called:
# once (15µs+0s) by Module::Runtime::require_module at line 9 # spent 15µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@9 |
10 | 2 | 29µs | 2 | 562µs | # spent 285µs (8+277) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@10 which was called:
# once (8µs+277µs) by Module::Runtime::require_module at line 10 # spent 285µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@10
# spent 277µs making 1 call to Moo::import |
11 | 3 | 93µs | 3 | 2.39ms | # spent 1.21ms (30µs+1.18) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@11 which was called:
# once (30µs+1.18ms) by Module::Runtime::require_module at line 11 # spent 1.21ms making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@11
# spent 1.15ms making 1 call to strictures::import
# spent 27µs making 1 call to strictures::VERSION |
12 | 2 | 73µs | 2 | 374µs | # spent 193µs (12+181) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@12 which was called:
# once (12µs+181µs) by Module::Runtime::require_module at line 12 # spent 193µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@12
# spent 181µs making 1 call to experimental::import |
13 | 2 | 52µs | 2 | 77µs | # spent 72µs (40+32) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@13 which was called:
# once (40µs+32µs) by Module::Runtime::require_module at line 13 # spent 72µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@13
# spent 5µs making 1 call to if::import |
14 | 2 | 66µs | 2 | 57µs | # spent 55µs (33+22) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@14 which was called:
# once (33µs+22µs) by Module::Runtime::require_module at line 14 # spent 55µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@14
# spent 2µs making 1 call to if::unimport |
15 | 2 | 35µs | 2 | 30µs | # spent 30µs (14+16) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@15 which was called:
# once (14µs+16µs) by Module::Runtime::require_module at line 15 # spent 30µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@15
# spent 0s making 1 call to if::unimport |
16 | 2 | 27µs | 2 | 32µs | # spent 30µs (10+20) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@16 which was called:
# once (10µs+20µs) by Module::Runtime::require_module at line 16 # spent 30µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@16
# spent 2µs making 1 call to if::unimport |
17 | 2 | 33µs | 2 | 175µs | # spent 95µs (15+80) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@17 which was called:
# once (15µs+80µs) by Module::Runtime::require_module at line 17 # spent 95µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@17
# spent 80µs making 1 call to Exporter::import |
18 | 2 | 25µs | 2 | 78µs | # spent 44µs (10+34) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@18 which was called:
# once (10µs+34µs) by Module::Runtime::require_module at line 18 # spent 44µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@18
# spent 34µs making 1 call to Feature::Compat::Try::import |
19 | 2 | 2.28ms | 2 | 789µs | # spent 402µs (15+387) within JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@19 which was called:
# once (15µs+387µs) by Module::Runtime::require_module at line 19 # spent 402µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::BEGIN@19
# spent 387µs making 1 call to namespace::clean::import |
20 | |||||
21 | 1 | 3µs | 1 | 522µs | with 'JSON::Schema::Modern::Vocabulary'; # spent 522µ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:696] at line 692 of JSON/Schema/Modern.pm | ||||
24 | 1 | 3µs | 'https://json-schema.org/draft/2020-12/vocab/format-assertion' => 'draft2020-12'; | ||
25 | } | ||||
26 | |||||
27 | sub evaluation_order { 3 } | ||||
28 | |||||
29 | # spent 3µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::keywords which was called:
# once (3µs+0s) by JSON::Schema::Modern::_eval_subschema at line 559 of JSON/Schema/Modern.pm | ||||
30 | 1 | 4µ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 | 4µ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 | 2µ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 | 26µs | 2 | 21µs | my $second = qr{${num}S}; # spent 20µ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 |
57 | 1 | 10µs | 2 | 8µs | my $minute = qr{${num}M}; # 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 |
58 | 1 | 10µs | 2 | 7µs | my $hour = qr{${num}H}; # 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 |
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 | 13µs | 2 | 10µs | my $month = qr{${num}M}; # spent 10µ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 |
62 | 1 | 12µs | 2 | 9µs | my $year = qr{${num}Y}; # spent 6µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp
# spent 3µs making 1 call to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr |
63 | 1 | 9µs | 2 | 5µs | my $week = qr{${num}W}; # spent 5µ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 | 23µs | 2 | 20µs | my $date = qr{(?=[0-9])(?:$year)?(?:$month)?(?:$day)?}; # spent 19µ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 | 52µs | 2 | 46µs | qr{^P(?:(?=.)(?:$date)?(?:$time)?|$week)$}; # spent 45µ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 3.07ms (1.01+2.06) 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 49µs/call:
# 63 times (1.01ms+2.06ms) by JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format at line 181, avg 49µs/call | ||||
130 | 63 | 367µs | local $SIG{__WARN__} = sub { die @_ }; | ||
131 | 189 | 2.77ms | 126 | 2.06ms | eval { qr/$_[0]/; 1 ? 1 : 0 }; # spent 1.98ms making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp, avg 31µs/call
# spent 76µs making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr, avg 1µs/call |
132 | }, | ||||
133 | |||||
134 | 'iri-reference' => sub { 1 }, | ||||
135 | 'uri-template' => sub { 1 }, | ||||
136 | 1 | 16µs | }; | ||
137 | |||||
138 | 189 | 45µs | # spent 175µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::_get_default_format_validation which was called 63 times, avg 3µs/call:
# 63 times (175µs+0s) by JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format at line 173, avg 3µs/call | ||
139 | 63 | 149µ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 | 100µs | # spent 25.7ms (1.62+24.1) within JSON::Schema::Modern::Vocabulary::FormatAssertion::_eval_keyword_format which was called 63 times, avg 408µs/call:
# 63 times (1.62ms+24.1ms) by JSON::Schema::Modern::_eval_subschema at line 574 of JSON/Schema/Modern.pm, avg 408µs/call | ||
149 | abort($state, 'unimplemented format "%s"', $schema->{format}) | ||||
150 | 63 | 39µs | if $schema->{format} eq 'uri-template'; | ||
151 | |||||
152 | 63 | 44µs | try { | ||
153 | 63 | 216µ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 | 201µs | 63 | 1.69ms | my $evaluator_spec = $state->{evaluator}->_get_format_validation($schema->{format}); # spent 1.69ms making 63 calls to JSON::Schema::Modern::_get_format_validation, avg 27µs/call |
173 | 63 | 176µs | 63 | 175µs | my $default_spec = $self->_get_default_format_validation($schema->{format}); # spent 175µs making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::_get_default_format_validation, avg 3µs/call |
174 | |||||
175 | 63 | 135µ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 | return E($state, 'not a%s %s', $schema->{format} =~ /^[aeio]/ ? 'n' : '', $schema->{format}) | ||||
181 | 63 | 198µs | 126 | 3.67ms | if $spec and is_type($spec->{type}, $data) and not $spec->{sub}->($data); # spent 3.07ms making 63 calls to JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:132], avg 49µs/call
# spent 596µs making 63 calls to JSON::Schema::Modern::Utilities::is_type, avg 9µs/call |
182 | |||||
183 | 63 | 340µs | 63 | 18.5ms | return A($state, $schema->{format}); # spent 18.5ms making 63 calls to JSON::Schema::Modern::Utilities::A, avg 294µs/call |
184 | } | ||||
185 | |||||
186 | 1 | 20µs | 1; | ||
187 | |||||
188 | 1 | 67µs | 1 | 393µs | __END__ # spent 393µs making 1 call to B::Hooks::EndOfScope::XS::__ANON__[B/Hooks/EndOfScope/XS.pm:26] |
# spent 87µs within JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:qr which was called 74 times, avg 1µs/call:
# 63 times (76µs+0s) by JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:132] at line 131, avg 1µs/call
# once (3µs+0s) by Module::Runtime::require_module at line 62
# once (2µs+0s) by Module::Runtime::require_module at line 55
# once (1µs+0s) by Module::Runtime::require_module at line 60
# once (1µs+0s) by Module::Runtime::require_module at line 56
# once (1µs+0s) by Module::Runtime::require_module at line 64
# once (1µs+0s) by Module::Runtime::require_module at line 58
# once (1µs+0s) by Module::Runtime::require_module at line 57
# once (1µs+0s) by Module::Runtime::require_module at line 65
# once (0s+0s) by Module::Runtime::require_module at line 61
# once (0s+0s) by Module::Runtime::require_module at line 63
# once (0s+0s) by Module::Runtime::require_module at line 59 | |||||
# spent 2.13ms within JSON::Schema::Modern::Vocabulary::FormatAssertion::CORE:regcomp which was called 73 times, avg 29µs/call:
# 63 times (1.98ms+0s) by JSON::Schema::Modern::Vocabulary::FormatAssertion::__ANON__[/Users/ether/.perlbrew/libs/36.0@std/lib/perl5/JSON/Schema/Modern/Vocabulary/FormatAssertion.pm:132] at line 131, avg 31µs/call
# once (45µs+0s) by Module::Runtime::require_module at line 65
# once (23µs+0s) by Module::Runtime::require_module at line 59
# once (20µs+0s) by Module::Runtime::require_module at line 56
# once (19µs+0s) by Module::Runtime::require_module at line 64
# once (10µs+0s) by Module::Runtime::require_module at line 61
# once (7µs+0s) by Module::Runtime::require_module at line 57
# once (7µs+0s) by Module::Runtime::require_module at line 60
# once (6µs+0s) by Module::Runtime::require_module at line 58
# once (6µs+0s) by Module::Runtime::require_module at line 62
# once (5µs+0s) by Module::Runtime::require_module at line 63 |