| 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 | Mojo::JSON::Pointer::_pointer |
| 47846 | 3 | 2 | 154ms | 987ms | Mojo::JSON::Pointer::get |
| 15 | 2 | 2 | 70µs | 108µs | Mojo::JSON::Pointer::new |
| 1 | 1 | 1 | 27µs | 208µs | Mojo::JSON::Pointer::BEGIN@2 |
| 0 | 0 | 0 | 0s | 0s | Mojo::JSON::Pointer::contains |
| 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 |