File Coverage

blib/lib/YAML/PP/Schema/Env.pm
Criterion Covered Total %
statement 34 35 100.0
branch 11 12 100.0
condition n/a
subroutine 5 5 100.0
pod 0 1 0.0
total 50 53 98.1


line stmt bran cond sub pod time code
1             # -*- perl -*-
2              
3             #
4             # Author: Slaven Rezic
5             #
6             # Copyright (C) 2023 Slaven Rezic. All rights reserved.
7             # This package is free software; you can redistribute it and/or
8             # modify it under the same terms as Perl itself.
9             #
10              
11             package YAML::PP::Schema::Env;
12              
13 1     1   3131 use strict;
  1         2  
  1         24  
14 1     1   4 use warnings;
  1         2  
  1         23  
15              
16 1     1   4 use Carp qw(croak);
  1         2  
  1         369  
17              
18             our $VERSION = '0.02';
19              
20             sub register {
21 6     6 0 9329 my ($self, %args) = @_;
22 6         10 my $schema = $args{schema};
23            
24 6         9 my $options = $args{options};
25 6         8 my $default_value;
26 6         8 my $default_separator = ':';
27 6         10 for my $opt (@$options) {
28 7 100       38 if ($opt =~ m{^defval=(.*)$}) {
    100          
29 4         10 $default_value = $1;
30             } elsif ($opt =~ m{defsep=(.*)$}) {
31 2         6 $default_separator = $1;
32             } else {
33 1         162 croak "Invalid option for ENV Schema: '$opt'";
34             }
35             }
36            
37             $schema->add_resolver(
38             tag => '!ENV',
39             match => [ all => sub {
40 28     28   59568 my ($constructor, $event) = @_;
41 28         165 (my $val = $event->{value}) =~ s{\$(\{.*?\})}{
42 37         118 my $capture = $1;
43             # uncoverable branch false
44 37 50       282 if ($capture =~ m{\{(.*?)(?:\Q$default_separator\E(.*))?\}$}) {
45 37         100 my($this_env, $this_default_value) = ($1, $2);
46 37         49 my $this_value;
47 37 100       69 if (!exists $ENV{$this_env}) {
48 23 100       45 if (defined $this_default_value) {
    100          
49 9         14 $this_value = $this_default_value;
50             } elsif (defined $default_value) {
51 12         17 $this_value = $default_value;
52             } else {
53 2         307 croak "There's no environment variable '$this_env', and no global or local default value was configured";
54             }
55             } else {
56 14         23 $this_value = $ENV{$this_env};
57             }
58 35         108 $this_value;
59             } else {
60             # uncoverable statement
61 0         0 croak "Unexpected error: cannot parse '$capture'";
62             }
63             }ge;
64 26         81 return $val;
65 5         49 }],
66             implicit => 0,
67             );
68             }
69              
70             1;
71              
72             __END__