Group
Extension

NVM-Perl/lib/NVMPL/Config.pm

package NVMPL::Config;
use strict;
use warnings;
use JSON::PP qw(decode_json);
use File::Spec;
use File::HomeDir;
use File::Path qw(make_path);

# Default config locations
my $SYSTEM_CONF = '/etc/nvm-pl.conf';
my $USER_CONF = File::Spec->catfile(File::HomeDir->my_home, '.nvmplrc');

# Default values (used if no config files exist)
my %DEFAULTS = (
    install_dir     => File::Spec->catdir(File::HomeDir->my_home, '.nvm-pl', 'install'),
    mirror_url      => 'https://nodejs.org/dist',
    cache_ttl       => 86400,
    auto_use        => 1,
    color_output    => 1,
    log_level       => 'info',
);

my %CONFIG;

# --------------------------------------------------------------------
# Initialize configuration (called once at startup)
# --------------------------------------------------------------------

sub load {
    my $class = shift;

    %CONFIG = %DEFAULTS;

    if (-f $SYSTEM_CONF) {
        _merge_config($SYSTEM_CONF);
    }

    if (-f $USER_CONF) {
        _merge_config($USER_CONF);
    }

    my $install_dir = $CONFIG{install_dir};
    for my $subdir (qw(downloads versions)) {
        my $path = File::Spec->catdir($install_dir, $subdir);
        make_path($path) unless -d $path;
    }

    return \%CONFIG;
}

# --------------------------------------------------------------------
# Return a single config value
# --------------------------------------------------------------------

sub get {
    my ($key) = @_;
    return $CONFIG{$key} // $DEFAULTS{$key};
}

# --------------------------------------------------------------------
# Internal helper: read and merge JSON or simple key=value config files
# --------------------------------------------------------------------

sub _merge_config {
    my ($file) = @_;

    open my $fh, '<', $file or do {
        warn "Warning: could not open $file: $!\n";
        return;
    };

    local $/;
    my $content = <$fh>;
    close $fh;

    my $data;
    eval { $data = decode_json($content) };
    if ($@) {
        for my $line (split /\n/, $content) {
            next if $line =~ /^\s*#/;
            next unless $line =~ /=/;
            my ($key, $val) = split /=/, $line, 2;
            $key =~ s/^\s+|\s+$//g;
            $val =~ s/^\s+|\s+$//g;
            $data->{$key} = $val if defined $key && defined $val;
        }
    }

    for my $k (keys %$data) {
        $CONFIG{$k} = $data->{$k};
    }
}

1;

Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.