package Kephra::Config::File; our $VERSION = '0.13'; use strict; use warnings; # # internal # sub _get_type { my $name = shift; if (not defined $name) { #$main::logger->error(" return; } return unless $name; return 'conf' if $name =~ /\.conf$/; return 'conf' if $name =~ /\.cfg$/; return 'yaml' if $name =~ /\.yaml$/; return 'yaml' if $name =~ /\.yml$/; return; # TODO: log or throw exception if no or invalid file given # make the extension checking stricter? # accept only .yml .yaml and .conf extension? } # # API 2 App # sub load_from_node_data { my $node = shift; return unless defined $node->{file} and $node->{node}; load_node( Kephra::Config::filepath( $node->{file} ), $node->{node} ); } sub load_node{ my $file_name = shift; my $start_node = shift; my $config_tree = load($file_name); return defined $start_node ? Kephra::Config::Tree::get_subtree( $config_tree, $start_node ) : $config_tree; } # !!! -NI sub store_node{ my $file_name = shift; my $start_node = shift; } sub load { my $file_name = shift; return unless -e $file_name; my $type = _get_type($file_name); return unless $type; if ($type eq 'conf') { load_conf($file_name) } elsif ($type eq 'yaml') { load_yaml($file_name) } } sub store { my $file_name = shift; my $config = shift; # if want to write into nonexisting dir, create it unless (-w $file_name){ my ($volume,$dir,$file) = File::Spec->splitpath( $file_name ); $dir = File::Spec->catdir( $volume, $dir ); mkdir $dir unless -e $dir; } my $type = _get_type($file_name); if ($type eq 'conf') { store_conf($file_name, $config) } elsif ($type eq 'yaml') { store_yaml($file_name, $config) } } # # API 2 YAML # sub load_yaml { &YAML::Tiny::LoadFile #if ($^O=~/(?:linux|darwin)/i) { #YAML::Tiny::Load( Kephra::File::IO::lin_load_file($_[0]) ) #} else { } } sub store_yaml { &YAML::Tiny::DumpFile } # # API 2 General::Config # sub load_conf { my $configfilename = shift; my $utf = shift || 0; my %config; my $error_msg = Kephra::Config::Localisation::strings()->{dialog}{error}; my %opt = ( -AutoTrue => 1, -UseApacheInclude => 1, -IncludeRelative => 1, -InterPolateVars => 0, -AllowMultiOptions => 1, -MergeDuplicateOptions => 0, -MergeDuplicateBlocks => 0, -SplitPolicy => 'equalsign', -SaveSorted => 1, -UTF8 => $utf, ); $opt{'-ConfigFile'} = $configfilename; #if ($^O=~/(?:linux|darwin)/i) {$opt{'-String'} = Kephra::File::IO::lin_load_file($configfilename);}else {} $Kephra::app{config}{parser}{conf} = Config::General->new(%opt); if ( -e $configfilename ) { eval { %config = $Kephra::app{config}{parser}{conf}->getall }; Kephra::Dialog::warning_box ("$configfilename: \n $@", $error_msg->{config_read}) if $@ or !%config; } else { Kephra::Dialog::warning_box ($error_msg->{config_read}."-".$configfilename, $error_msg->{file}); } \%config; } sub store_conf { my ( $configfilename, $config ) = @_; $Kephra::app{config}{parser}{conf}->save_file( $configfilename, $config ); } 1; =head1 NAME Kephra::Config::File - IO of config files =head1 DESCRIPTION =cut