File: Extended.pm

package info (click to toggle)
libdancer2-perl 2.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,768 kB
  • sloc: perl: 8,671; sql: 14; makefile: 8
file content (66 lines) | stat: -rw-r--r-- 2,043 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package Dancer2::ConfigReader::File::Extended;

use Moo;
use Dancer2::Core::Types;

use Carp 'croak';

extends 'Dancer2::ConfigReader::Config::Any';

has name => (
    is      => 'ro',
    isa     => Str,
    lazy    => 0,
    default => sub {'File::Extended'},
);

around read_config => sub {
    my ($orig, $self) = @_;
    my $config = $orig->($self, @_);
    $self->_replace_env_vars($config);
    return $config;
};

# Attn. We are traversing along the original data structure all the time,
# using references, and changing values on the spot, not returning anything.
sub _replace_env_vars {
    my ( $self, $entry ) = @_;
    if( ref $entry ne 'HASH' && ref $entry ne 'ARRAY' ) {
        croak 'Param entry is not HASH or ARRAY';
    }
    if( ref $entry eq 'HASH' ) {
        foreach my $value (values %{ $entry }) {
            if( (ref $value) =~ m/(HASH|ARRAY)/msx ) {
                    $self->_replace_env_vars( $value );
                } elsif( (ref $value) =~ m/(CODE|REF|GLOB)/msx ) {
                    # Pretty much anything else except SCALAR. Do nothing
                    1;
                } else {
                    if( $value ) {
                        while( my ($k, $v) = each %ENV) {
                            $value =~ s/ \$ [{] ENV:$k [}] /$v/gmsx;
                        }
                    }
                }
            }
        } else {
            # ref $entry is 'ARRAY'
            foreach my $value (@{ $entry }) {
                if( (ref $value) =~ m/(HASH|ARRAY)/msx ) {
                        $self->_replace_env_vars( $value );
                } elsif( (ref $value) =~ m/(CODE|REF|GLOB)/msx ) {
                    # Pretty much anything else except SCALAR. Do nothing
                    1;
                } else {
                    if( $value ) {
                        while( my ($k, $v) = each %ENV) {
                            $value =~ s/ \$ [{] ENV:$k [}] /$v/gmsx;
                        }
                    }
                }
            }
        }
    return;
}

1;