Filename | /Users/ether/.perlbrew/libs/36.0@std/lib/perl5/Mojo/JSON/Pointer.pm |
Statements | Executed 380420 statements in 723ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
47846 | 1 | 1 | 530ms | 833ms | _pointer | Mojo::JSON::Pointer::
47846 | 3 | 2 | 154ms | 987ms | get | Mojo::JSON::Pointer::
15 | 2 | 2 | 70µs | 108µs | new | Mojo::JSON::Pointer::
1 | 1 | 1 | 27µs | 208µs | BEGIN@2 | Mojo::JSON::Pointer::
0 | 0 | 0 | 0s | 0s | contains | Mojo::JSON::Pointer::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package Mojo::JSON::Pointer; | ||||
2 | 2 | 326µs | 2 | 389µs | # spent 208µs (27+181) within Mojo::JSON::Pointer::BEGIN@2 which was called:
# once (27µs+181µs) by Moo::_Utils::_require at line 2 # spent 208µs making 1 call to Mojo::JSON::Pointer::BEGIN@2
# spent 181µs making 1 call to Mojo::Base::import |
3 | |||||
4 | 1 | 2µs | 1 | 38µs | has 'data'; # spent 38µs making 1 call to Mojo::JSON::Pointer::has |
5 | |||||
6 | sub contains { shift->_pointer(0, @_) } | ||||
7 | 47846 | 118ms | 47846 | 833ms | # spent 987ms (154+833) within Mojo::JSON::Pointer::get which was called 47846 times, avg 21µs/call:
# 39123 times (124ms+628ms) by JSON::Schema::Modern::_fetch_from_uri at line 828 of JSON/Schema/Modern.pm, avg 19µs/call
# 7758 times (25.1ms+149ms) by JSON::Schema::Modern::_fetch_from_uri at line 852 of JSON/Schema/Modern.pm, avg 22µs/call
# 965 times (4.57ms+55.4ms) by JSON::Schema::Modern::Document::OpenAPI::traverse at line 161 of JSON/Schema/Modern/Document/OpenAPI.pm, avg 62µs/call # spent 833ms making 47846 calls to Mojo::JSON::Pointer::_pointer, avg 17µs/call |
8 | |||||
9 | 15 | 67µs | 15 | 38µs | # spent 108µs (70+38) within Mojo::JSON::Pointer::new which was called 15 times, avg 7µs/call:
# 14 times (61µs+35µs) by JSON::Schema::Modern::Document::new at line 53 of (eval 424)[Sub/Quote.pm:3], avg 7µs/call
# once (9µs+3µs) by JSON::Schema::Modern::Document::OpenAPI::new at line 56 of (eval 417)[Sub/Quote.pm:3] # spent 38µs making 15 calls to Mojo::Base::new, avg 3µs/call |
10 | |||||
11 | # spent 833ms (530+303) within Mojo::JSON::Pointer::_pointer which was called 47846 times, avg 17µs/call:
# 47846 times (530ms+303ms) by Mojo::JSON::Pointer::get at line 7, avg 17µs/call | ||||
12 | 47846 | 29.6ms | my ($self, $get, $pointer) = @_; | ||
13 | |||||
14 | 47846 | 70.4ms | 47846 | 223ms | my $data = $self->data; # spent 223ms making 47846 calls to JSON::Schema::Modern::Document::data, avg 5µs/call |
15 | 47846 | 181ms | 47846 | 49.7ms | return length $pointer ? undef : $get ? $data : 1 unless $pointer =~ s!^/!!; # spent 49.7ms making 47846 calls to Mojo::JSON::Pointer::CORE:subst, avg 1µs/call |
16 | 20362 | 51.6ms | for my $p (length $pointer ? (split /\//, $pointer, -1) : ($pointer)) { | ||
17 | 49431 | 88.2ms | 49431 | 18.1ms | $p =~ s!~1!/!g; # spent 18.1ms making 49431 calls to Mojo::JSON::Pointer::CORE:subst, avg 365ns/call |
18 | 49431 | 54.4ms | 49431 | 11.3ms | $p =~ s/~0/~/g; # spent 11.3ms making 49431 calls to Mojo::JSON::Pointer::CORE:subst, avg 229ns/call |
19 | |||||
20 | # Hash | ||||
21 | 49431 | 93.5ms | 211 | 877µs | if (ref $data eq 'HASH' && exists $data->{$p}) { $data = $data->{$p} } # spent 877µs making 211 calls to Mojo::JSON::Pointer::CORE:match, avg 4µs/call |
22 | |||||
23 | # Array | ||||
24 | elsif (ref $data eq 'ARRAY' && $p =~ /^\d+$/ && @$data > $p) { $data = $data->[$p] } | ||||
25 | |||||
26 | # Nothing | ||||
27 | else { return undef } | ||||
28 | } | ||||
29 | |||||
30 | 20362 | 36.9ms | return $get ? $data : 1; | ||
31 | } | ||||
32 | |||||
33 | 1 | 2µs | 1; | ||
34 | |||||
35 | =encoding utf8 | ||||
36 | |||||
37 | =head1 NAME | ||||
38 | |||||
39 | Mojo::JSON::Pointer - JSON Pointers | ||||
40 | |||||
41 | =head1 SYNOPSIS | ||||
42 | |||||
43 | use Mojo::JSON::Pointer; | ||||
44 | |||||
45 | my $pointer = Mojo::JSON::Pointer->new({foo => [23, 'bar']}); | ||||
46 | say $pointer->get('/foo/1'); | ||||
47 | say 'Contains "/foo".' if $pointer->contains('/foo'); | ||||
48 | |||||
49 | =head1 DESCRIPTION | ||||
50 | |||||
51 | L<Mojo::JSON::Pointer> is an implementation of L<RFC 6901|https://tools.ietf.org/html/rfc6901>. | ||||
52 | |||||
53 | =head1 ATTRIBUTES | ||||
54 | |||||
55 | L<Mojo::JSON::Pointer> implements the following attributes. | ||||
56 | |||||
57 | =head2 data | ||||
58 | |||||
59 | my $data = $pointer->data; | ||||
60 | $pointer = $pointer->data({foo => 'bar'}); | ||||
61 | |||||
62 | Data structure to be processed. | ||||
63 | |||||
64 | =head1 METHODS | ||||
65 | |||||
66 | L<Mojo::JSON::Pointer> inherits all methods from L<Mojo::Base> and implements the following new ones. | ||||
67 | |||||
68 | =head2 contains | ||||
69 | |||||
70 | my $bool = $pointer->contains('/foo/1'); | ||||
71 | |||||
72 | Check if L</"data"> contains a value that can be identified with the given JSON Pointer. | ||||
73 | |||||
74 | # True | ||||
75 | Mojo::JSON::Pointer->new('just a string')->contains(''); | ||||
76 | Mojo::JSON::Pointer->new({'♥' => 'mojolicious'})->contains('/♥'); | ||||
77 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/foo'); | ||||
78 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/baz/1'); | ||||
79 | |||||
80 | # False | ||||
81 | Mojo::JSON::Pointer->new({'♥' => 'mojolicious'})->contains('/☃'); | ||||
82 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/bar'); | ||||
83 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5]})->contains('/baz/9'); | ||||
84 | |||||
85 | =head2 get | ||||
86 | |||||
87 | my $value = $pointer->get('/foo/bar'); | ||||
88 | |||||
89 | Extract value from L</"data"> identified by the given JSON Pointer. | ||||
90 | |||||
91 | # "just a string" | ||||
92 | Mojo::JSON::Pointer->new('just a string')->get(''); | ||||
93 | |||||
94 | # "mojolicious" | ||||
95 | Mojo::JSON::Pointer->new({'♥' => 'mojolicious'})->get('/♥'); | ||||
96 | |||||
97 | # "bar" | ||||
98 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/foo'); | ||||
99 | |||||
100 | # "4" | ||||
101 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/baz/0'); | ||||
102 | |||||
103 | # "6" | ||||
104 | Mojo::JSON::Pointer->new({foo => 'bar', baz => [4, 5, 6]})->get('/baz/2'); | ||||
105 | |||||
106 | =head2 new | ||||
107 | |||||
108 | my $pointer = Mojo::JSON::Pointer->new; | ||||
109 | my $pointer = Mojo::JSON::Pointer->new({foo => 'bar'}); | ||||
110 | |||||
111 | Build new L<Mojo::JSON::Pointer> object. | ||||
112 | |||||
113 | =head1 SEE ALSO | ||||
114 | |||||
115 | L<Mojolicious>, L<Mojolicious::Guides>, L<https://mojolicious.org>. | ||||
116 | |||||
117 | =cut |