File Coverage

blib/lib/OpenTelemetry/Context.pm
Criterion Covered Total %
statement 66 66 100.0
branch 10 10 100.0
condition n/a
subroutine 17 17 100.0
pod 5 6 83.3
total 98 99 98.9


line stmt bran cond sub pod time code
1 14     14   228328 use Object::Pad ':experimental(init_expr)';
  14         47140  
  14         191  
2             # ABSTRACT: A context class for OpenTelemetry
3              
4             package
5             OpenTelemetry::Context::Key;
6              
7             our $VERSION = '0.033';
8              
9             class OpenTelemetry::Context::Key {
10 14     14   13486 use UUID::URandom 'create_uuid';
  14         142656  
  14         8639  
11              
12             field $name :param;
13 133     133   8518 field $string :reader;
  133         960  
14              
15             ADJUST { $string = $name . '-' . unpack( 'H*', create_uuid ) };
16             }
17              
18             package OpenTelemetry::Context;
19              
20             our $VERSION = '0.033';
21              
22 38     38 1 256879 sub key ( $, $name ) {
  38         117  
  38         61  
23 38         530 OpenTelemetry::Context::Key->new( name => $name );
24             }
25              
26             class OpenTelemetry::Context {
27 14     14   1384 use Carp qw( carp croak );
  14         34  
  14         1080  
28 14     14   95 use List::Util qw( pairs all );
  14         25  
  14         1069  
29 14     14   11558 use OpenTelemetry::X;
  14         75  
  14         740  
30              
31 14     14   6170 use isa 'OpenTelemetry::Context::Key';
  14         109900  
  14         145  
32              
33             field $data;
34              
35 67     67 0 374261 sub BUILDARGS ( $class, %args ) {
  67         138  
  67         116  
  67         94  
36 67 100       392 carp 'The OpenTelemetry::Context constructor no longer takes arguments'
37             if %args;
38 67         478 return;
39             }
40              
41             method $init ( %data ) {
42             $data = \%data;
43             $self;
44             }
45              
46 78     78 1 6871 method get ( $key ) {
  78         258  
  78         113  
  78         103  
47 78 100       428 croak +OpenTelemetry::X->create(
48             Invalid => 'Keys in a context object must be instances of OpenTelemetry::Context::Key',
49             ) unless isa_OpenTelemetry_Context_Key $key;
50              
51 77         228 $data->{ $key->string };
52             }
53              
54 46     46 1 2248 method set ( @pairs ) {
  46         188  
  46         129  
  46         75  
55 46         81 my %pairs;
56 46         432 for ( pairs @pairs ) {
57 49 100       354 croak +OpenTelemetry::X->create(
58             Invalid => 'Keys in a context object must be instances of OpenTelemetry::Context::Key',
59             ) unless isa_OpenTelemetry_Context_Key $_->[0];
60              
61 48         202 $pairs{ $_->[0]->string } = $_->[1];
62             }
63              
64 45         385 OpenTelemetry::Context->new->$init( %$data, %pairs );
65             }
66              
67 5     5 1 640 method delete ( @keys ) {
  5         18  
  5         13  
  5         7  
68 5         9 my @strings;
69 5         14 for (@keys) {
70 7 100       34 croak +OpenTelemetry::X->create(
71             Invalid => 'Keys in a context object must be instances of OpenTelemetry::Context::Key',
72             ) unless isa_OpenTelemetry_Context_Key $_;
73              
74 6         19 push @strings, $_->string;
75             }
76              
77 4         15 my %copy = %$data;
78 4         11 delete @copy{@strings};
79              
80 4         21 OpenTelemetry::Context->new->$init(%copy);
81             }
82             }
83              
84             # Context management
85             {
86 14     14   26270 use Sentinel;
  14         20421  
  14         1290  
87              
88 14     14   113 use isa 'OpenTelemetry::Context';
  14         29  
  14         92  
89              
90             my $current = OpenTelemetry::Context->new;
91             sub current :lvalue {
92             sentinel(
93 125     125   657 get => sub { $current },
94             set => sub {
95 45 100   45   3265 croak +OpenTelemetry::X->create(
96             Invalid => 'Current context must be an instance of OpenTelemetry::Context, received instead ' . ref $_[0],
97             ) unless isa_OpenTelemetry_Context $_[0];
98              
99 44         507 $current = $_[0];
100             },
101 96     96 1 403524 );
102             }
103             }
104              
105             1;