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 )