diff options
Diffstat (limited to 'lib/AniDB/Manager.pm')
-rw-r--r-- | lib/AniDB/Manager.pm | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/AniDB/Manager.pm b/lib/AniDB/Manager.pm new file mode 100644 index 0000000..eeb724f --- /dev/null +++ b/lib/AniDB/Manager.pm @@ -0,0 +1,64 @@ +package AniDB::Manager; +use 5.024; +use experimental 'signatures'; +use Moo; +use Log::Any '$log'; +use Path::Tiny; +use namespace::clean; + +has datastore => ( + is => 'ro', + required => 1, + handles => [qw(update)], +); + +around BUILDARGS => sub($orig,$class,@args) { + my $args = $class->$orig(@args); + if (my $db_name = $args->{database}) { + require AniDB::Datastore; + $args->{datastore} = AniDB::Datastore->new({ + database => $db_name, + }); + } + return $args; +}; + +has renamer => ( + is => 'ro', + lazy => 1, +); + +sub _build_renamer { + require AniDB::Renamer; + return AniDB::Renamer->new(); +} + +sub new_name_for($self,$path) { + $path = path($path)->realpath; + my $full_info = $self->datastore->full_info_for($path); + return $self->renamer->new_name_for($path,$full_info); +} + +sub maybe_new_name_for($self,$path) { + my $new_name = $self->new_name_for($path); + return if $new_name eq $path; + return $new_name; +} + +sub rename($self,$path,$new_path) { + $path = path($path)->realpath; + $new_path ||= $self->new_name_for($path); + if ($path->move($new_path)) { + $self->datastore->rename($path,$new_path); + return 1; + } + else { + $log->errorf( + 'failed to rename %s to %s', + $path, $new_path, + ); + return; + } +} + +1; |