use File::Temp;
use JSON::Fast;
use WebCoso::File;
use WebCoso::FileSet;
use WebCoso::Doc::Page;
use WebCoso::Doc::Feed;
class WebCoso {
has $.srcdir;
has $.destdir;
has $!tmpdir = tempdir.IO;
has %!docs;
method load-deps($dir,$basename,$ext) {
my %deps = try { from-json($.srcdir.child('deps.json').IO.slurp) } // {};
my %ret = %deps{$dir}{$basename}{$ext} // {};
return WebCoso::FileSet.new(files-hash=>%ret);
}
method save-deps($dir,$basename,$ext,$new-deps) {
my %deps = try { from-json($.srcdir.child('deps.json').IO.slurp) } // {};
%deps{$dir}{$basename}{$ext} = $new-deps.export-hash;
$.srcdir.child('deps.json').IO.spurt(to-json(%deps));
}
method get-src-files($dir,$basename,$ext) {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-src-files($dir,$basename,$ext)";
my @filesets = (gather {
for $.srcdir,$!tmpdir -> $base {
take WebCoso::FileSet.new(
path => ( $dir ?? $base.child($dir) !! $base ),
:$basename, :$ext,
);
}
}).values;
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-src-files($dir,$basename,$ext) files = {@filesets».files}";
return @filesets.reduce({$^a.merged-with($^b)});
}
method get-file($dir,$path) {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-file($dir,$path)";
return WebCoso::File.new($.srcdir.child($dir).child($path));
}
method get-made-files($dir,$basename,$ext) {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-made-files($dir,$basename,$ext)";
if %!docs{$dir}{$basename} -> $doc {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-made-files($dir,$basename,$ext) at $doc";
return $doc.make-by-ext($ext)
}
return ();
}
method get-files($dir,$basename,$ext,:$make=True) {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::get-files($dir,$basename,$ext,$make)";
my $src = self.get-src-files($dir,$basename,$ext);
my $made = ( $make ?? self.get-made-files($dir,$basename,$ext) !! () );
return $src.merged-with($made);
}
method put-file($dir,$basename,$lang,$ext,$contents) {
say "WebCoso($.srcdir,$.destdir,$!tmpdir)::put-file($dir,$basename,$lang,$ext)";
my $t = ($dir ?? $!tmpdir.child($dir) !! $!tmpdir);
$t.mkdir;
my $f = WebCoso::File.new(:$lang,path=>$t.child("{$basename}.{$lang}.{$ext}"));
$f.contents($contents);
return $f;
}
method new-page($dir) {
%!docs{$dir}{WebCoso::Doc::Page.basename}
= WebCoso::Doc::Page.new(:$dir,wc=>self);
}
method new-feed($dir) {
%!docs{$dir}{WebCoso::Doc::Feed.basename}
= WebCoso::Doc::Feed.new(:$dir,wc=>self);
}
method run() {
.make() for %!docs.values».values.flat
}
}