File Coverage

blib/lib/Aion/Env.pm
Criterion Covered Total %
statement 34 42 80.9
branch 15 24 62.5
condition 11 12 91.6
subroutine 5 5 100.0
pod 1 1 100.0
total 66 84 78.5


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