diff options
author | dakkar <dakkar@thenautilus.net> | 2015-09-11 15:32:51 +0100 |
---|---|---|
committer | dakkar <dakkar@thenautilus.net> | 2015-09-11 15:32:51 +0100 |
commit | df354d91e7e315b839d5c292e386e64ca339cb07 (patch) | |
tree | 476314347374acc122848a6d0202fb137aba225f /lib/WebCoso/FileSet.pm | |
parent | fix deps out-of-date comparison (diff) | |
download | WebCoso-p6-df354d91e7e315b839d5c292e386e64ca339cb07.tar.gz WebCoso-p6-df354d91e7e315b839d5c292e386e64ca339cb07.tar.bz2 WebCoso-p6-df354d91e7e315b839d5c292e386e64ca339cb07.zip |
filesets! don't work
I think I'm trying to be too clever, merging "these files make up a
document, a file per language" with "these files are needed to build a
result file in a certain language". Those should probably be separate
classes.
Diffstat (limited to 'lib/WebCoso/FileSet.pm')
-rw-r--r-- | lib/WebCoso/FileSet.pm | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/lib/WebCoso/FileSet.pm b/lib/WebCoso/FileSet.pm new file mode 100644 index 0000000..958a649 --- /dev/null +++ b/lib/WebCoso/FileSet.pm @@ -0,0 +1,115 @@ +# -*- mode: perl6 -*- +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); + } +} |