use WebCoso::File;
class WebCoso::FileSet {
has %.files;
multi method new($self: :$path!, :$basename!, :$ext!) {
my @filenames = try {
CATCH { when X::IO { } }
$path.IO.dir(
test => /$basename \. .+? \. $ext/,
)
} // ();
my %files = map {
my $lang = (.basename ~~ /$basename \. (.+?) \. $ext/)[0].Str;
$lang => WebCoso::File.new(:$lang,path=>$_)
}, @filenames;
$self.bless(:%files);
}
multi method new($self: :@files!) {
$self.bless(files=>{}).merged-with(@files);
}
multi method new($self: :%files-hash!) {
$self.bless(files=>{}).merged-with(%files-hash);
}
multi method new($self: :%files!) {
$self.bless(files=>%files);
}
submethod BUILD(:%!files) {}
method langs() {
return %!files.keys;
}
method files() {
return %!files.values;
}
method export-hash() {
my %ret;
for $.langs -> $lang {
my $f = $.for-lang($lang);
if ($f.does(Iterable)) {
%ret{$lang} = $f.list».path».Str;
}
else {
%ret{$lang} = $f.path.Str;
}
}
return %ret;
}
method for-lang($lang) {
return %!files{$lang} // ();
}
multi method set-for-lang($lang,WebCoso::File @files) {
return %!files{$lang} = @files;
}
multi method set-for-lang($lang,WebCoso::File $file) {
return %!files{$lang} = $file;
}
multi method set-for-lang($lang,@files) {
return %!files{$lang} = map {
$_.isa(WebCoso::File) ?? $_ !! WebCoso::File.new($_)
},@files;
}
multi method set-for-lang($lang,$file) {
return %!files{$lang} = WebCoso::File.new($file);
}
multi method merged-with(Any:U $) { return self }
multi method merged-with(% where !*) { return self }
multi method merged-with(@ where !*) { return self }
multi method merged-with(WebCoso::File %b where *) {
my %new-files = %!files;
%new-files{$_} = %b{$_} for %b.keys;
return self.new(
files => %new-files,
);
}
multi method merged-with(%b where *) {
my WebCoso::File %files = map {
my $lang = $_;
my $v = %b{$_};
$lang => (
$v.isa(WebCoso::File)
?? $v
!! $v.does(Iterable)
?? [ map { WebCoso::File.new(:$lang,path=>$_) },$v ]
!! WebCoso::File.new(:$lang,path=>$v)
)
},%b.keys;
return self.merged-with(%files);
}
multi method merged-with(WebCoso::File @b where *) {
self.merged-with(
%(map { $_.lang => $_ },@b),
);
}
multi method merged-with(@b where *) {
my WebCoso::File %files = map {
$_.isa(WebCoso::File)
?? (($_.lang//'') => $_)
!! ('' => WebCoso::File.new(path=>$_))
},@b;
self.merged-with(%files);
}
multi method merged-with(WebCoso::FileSet:D $b) {
self.merged-with($b.files);
}
}