summaryrefslogtreecommitdiff
path: root/lib/AniDB/Manager.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/AniDB/Manager.pm')
-rw-r--r--lib/AniDB/Manager.pm64
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;