correct symlink generation
[engit/Iron-Munger.git] / lib / IronMunger / StatsSaver.pm
1 use MooseX::Declare;
2
3 class IronMunger::StatsSaver {
4
5   use MooseX::Types::Path::Class qw(Dir);
6   use aliased 'IronMunger::Monger';
7   use IO::All;
8   use File::Path qw(mkpath);
9   use Text::CSV_XS;
10   use namespace::autoclean;
11
12   has dir => (is => 'ro', isa => Dir, required => 1, coerce => 1);
13
14   my @types = qw(male female);
15
16   method _image_symlink_target (Str $type, Str $level) {
17     $self->dir->subdir('badges')->subdir($type)->file("${level}.png");
18   }
19
20   method _image_symlink_from (Str $user, Str $type) {
21     $self->dir->subdir('mybadge')->subdir($type)->file("${user}.png");
22   }
23
24   method _write_image_symlink (Str $user, Str $type, Str $level) {
25     my ($from, $target) = (
26       $self->_image_symlink_from($user, $type),
27       $self->_image_symlink_target($type, $level),
28     );
29     my $dir = File::Spec->catpath((File::Spec->splitpath($from))[0,1]);
30     mkpath($dir);
31     symlink($target, $from)
32       or confess "Couldn't symlink ${from} to ${target}: $!";
33     return;
34   }
35
36   method _write_symlinks_for (IronMunger::Monger $monger) {
37     foreach my $type (@types) {
38       foreach my $name (
39           map $monger->$_,
40             grep $monger->${\"has_$_"},
41               qw(name nick)
42         ) {
43         $self->_write_image_symlink($name, $type, $monger->level);
44       }
45     }
46   }
47
48   method _write_summary_csv (ArrayRef[IronMunger::Monger] $mongers) {
49   }
50
51   method mongers (ArrayRef[IronMunger::Monger] $mongers) {
52     $self->_write_summary_csv($mongers);
53     $self->_write_symlinks_for($_) for @$mongers;
54   }
55
56 }
57
58 1;