App-MHFS

 view release on metacpan or  search on metacpan

lib/MHFS/Settings.pm  view on Meta::CPAN

package MHFS::Settings v0.7.0;
use 5.014;
use strict; use warnings;
use feature 'say';
use Scalar::Util qw(reftype);
use MIME::Base64 qw(encode_base64url);
use File::Basename;
use Digest::MD5 qw(md5);
use Storable qw(freeze);
use Cwd qw(abs_path);
use File::ShareDir qw(dist_dir);
use File::Path qw(make_path);
use File::Spec::Functions qw(rel2abs);
use MHFS::Util qw(write_text_file parse_ipv4);

sub write_settings_file {
    my ($SETTINGS, $filepath) = @_;
    my $indentcnst = 4;
    my $indentspace = '';
    my $settingscontents = "#!/usr/bin/perl\nuse strict; use warnings;\n\nmy \$SETTINGS = ";

    # we only encode SCALARS. Loop through expanding HASH and ARRAY refs into SCALARS
    my @values = ($SETTINGS);
    while(@values) {
        my $value = shift @values;
        my $type = reftype($value);
        say "value: $value type: " . ($type // 'undef');
        my $raw;
        my $noindent;
        if(! defined $type) {
            if(defined $value) {
                # process lead control code if provided
                $raw = ($value eq '__raw');
                $noindent = ($value eq '__noindent');
                if($raw || $noindent) {
                    $value = shift @values;
                }
            }

            if(! defined $value) {
                $raw = 1;
                $value = 'undef';
                $type = 'SCALAR';
            }
            elsif($value eq '__indent-') {
                substr($indentspace, -4, 4, '');
                # don't actually encode anything
                $value = '';
                $type = 'NOP';
            }
            else {
                $type = reftype($value) // 'SCALAR';
            }
        }

        say "v2: $value type $type";
        if($type eq 'NOP') {
            next;
        }

        $settingscontents .= $indentspace if(! $noindent);
        if($type eq 'SCALAR') {
            # encode the value
            if(! $raw) {
                $value =~ s/'/\\'/g;
                $value = "'".$value."'";
            }

            # add the value to the buffer
            $settingscontents .= $value;
            $settingscontents .= ",\n" if(! $raw);
        }
        elsif($type eq 'HASH') {
            $settingscontents .= "{\n";
            $indentspace .= (' ' x $indentcnst);
            my @toprepend;
            foreach my $key (keys %{$value}) {
                push @toprepend, '__raw', "'$key' => ", '__noindent', $value->{$key};
            }
            push @toprepend, '__indent-', '__raw', "},\n";
            unshift(@values, @toprepend);
        }



( run in 0.869 second using v1.01-cache-2.11-cpan-97f6503c9c8 )