File Coverage

blib/lib/Aion/Env.pm
Criterion Covered Total %
statement 31 38 81.5
branch 14 20 70.0
condition 11 12 91.6
subroutine 5 5 100.0
pod 1 1 100.0
total 62 76 81.5


line stmt bran cond sub pod time code
1             package Aion::Env;
2              
3 5     5   938 use common::sense;
  5         12  
  5         40  
4              
5 5     5   419 use constant {};
  5         8  
  5         4921  
6              
7             our %env = %{ -e '.env'? parse('.env'): () };
8              
9             sub import {
10 15     15   293090 my ($cls, $name, %kw) = @_;
11 15         30 my $isa = delete $kw{isa};
12 15         27 my $is_default = exists $kw{default};
13 15         24 my $default = delete $kw{default};
14 15 100       71 die sprintf "Unknown keyword%s: %s",
    100          
15             scalar keys %kw == 1? '': 's',
16             join ", ", sort keys %kw if keys %kw;
17            
18 13 100 100     148 die "$name is'nt defined!" if !exists $ENV{$name} && !exists $env{$name} && !$is_default;
      100        
19              
20 12         27 my $pkg = caller;
21 12   100     64 my $val = $ENV{$name} // $env{$name} // $default;
      66        
22              
23 12 100       30 $isa->validate($val, $name) if $isa;
24            
25 12         22858 constant->import("$pkg\::$name", $val);
26             }
27              
28             my $BOM = "\x{feff}";
29             sub parse {
30 1     1 1 3 my ($file) = @_;
31 1 50       32 open my $f, '<:utf8', $file or die "$file: $!";
32              
33 1         1 my %env;
34             my $interpolate = sub {
35 2     2   9 $_[0] =~ s!\$\{(\w+)\}!$env{$1}!ge;
  1         4  
36 1         4 };
37            
38 1         34 while(<$f>) {
39 2 100       18 s/^$BOM// if $. == 1;
40 2 50       7 next if /^\s*(?:#|$)/;
41            
42 2 50       17 if(my ($k, $v) = /^\s*([a-z_]\w*)\s*=\s*(.*?)\s*$/i) {
43 2 50       6 if($v =~ s/^(['"])(.*)\1\z/$2/) {
44 0 0       0 if($1 eq '"') {
45 0         0 $v =~ s/\\n/\n/g;
46 0         0 $v =~ s/\\//g;
47 0         0 $interpolate->($v);
48             }
49             }
50 2         3 else { $interpolate->($v) }
51 2         13 $env{$k} = $v;
52             }
53             else {
54 0         0 my $message = "Can't parse $file line $.: $_";
55 0         0 close $f;
56 0         0 die $message;
57             }
58             }
59              
60 1         9 close $f;
61            
62 1         9 \%env
63             };
64              
65             1;
66              
67             __END__