package WebCoso::Config;
use strict;
use warnings;
use WebCoso::Collections;
use WebCoso::Pipeline;
use WebCoso::X;
use utf8;
my @resources;
my $collections=WebCoso::Collections->new();
my %resource_to_pipeline;
sub read_scalar {
my ($class,$content,$filename)=@_;
$WebCoso::Config::Helpers::FILENAME=$filename;
$content=<<'EOF'.$content;
package WEBCOSO::CONFIG;
no strict;
WebCoso::Config::Helpers->import();
EOF
eval $content;
if ($@) {
WebCoso::X::ConfigError->throw(
filename => $filename,
nested => $@,
);
}
else {
return 1;
}
}
sub add_resource {
my ($class,$resource)=@_;
push @resources,$resource;
}
sub get_all_resources {
return @resources;
}
sub add_collection {
my ($class,$collection)=@_;
$collections->add_collection($collection);
}
sub get_collections {
return $collections;
}
sub get_pipeline_for {
my ($class, $resource)=@_;
WebCoso::X::NoSuchResource->throw(
resource => $resource,
) unless exists $resource_to_pipeline{$resource};
return $resource_to_pipeline{$resource};
}
sub clear {
@resources=();
$collections=WebCoso::Collections->new();
%resource_to_pipeline=();
}
package WebCoso::Config::Helpers;
use Path::Class;
use WebCoso::Resource;
use WebCoso::Collection;
use Exporter::Lite;
use vars qw($FILENAME @EXPORT);
@EXPORT=qw(res coll);
sub res {
my $dest_filename=pop @_;
my $short_pipeline_name=pop @_;
my @source_files=@_;
my $config_dir=file($FILENAME)->parent->absolute;
$dest_filename=file($dest_filename)->absolute($config_dir);
my @abs_source_files = map {
my $abs_name=file($_)->absolute($config_dir);
if (!-e $abs_name) {
WebCoso::X::FileNotFound->throw(
filename => $_,
abs_filename => $abs_name,
);
};
$abs_name;
} @source_files;
my $pipeline_name="WebCoso::Pipeline::$short_pipeline_name";
if (! WebCoso::Pipeline->is_pipeline($pipeline_name)) {
WebCoso::X::NoSuchPipeline->throw(
pipeline => $short_pipeline_name,
);
};
my $resource=WebCoso::Resource->new();
$resource->set_property(sources=>[@abs_source_files]);
$resource->set_property(destination=>$dest_filename);
for my $filename (@abs_source_files) {
$resource->set_property(
{filename=>$filename},
datastream => sub{_open_file($filename)},
);
}
WebCoso::Config->add_resource($resource);
$resource_to_pipeline{$resource}=$pipeline_name;
return $resource;
}
sub coll {
my ($name,$parents,$children,$resources)=@_;
my $collection=WebCoso::Collection->new({
name=>$name,
parents=>$parents||[],
children=>$children||[],
resources=>$resources||[],
});
return $collection;
}
sub _open_file {
my ($filename)=@_;
open my $fh,'<:raw',$filename
or WebCoso::X::OpenError->throw(
filename => $filename,
error => $!);
return $fh;
}
1;