426b241b4903e10935b219a7c0620b4e70bef817
[scpubgit/DKit.git] / lib / DX / Lib / FS / Action / CreateFile.pm
1 package DX::Lib::FS::Action::CreateFile;
2
3 use aliased 'DX::Lib::FS::Fact::PathStatus';
4 use aliased 'DX::Lib::FS::Fact::PathStatusInfo';
5 use Fcntl qw(O_CREAT O_WRONLY);
6 use Moo;
7
8 with 'DX::Role::Action';
9
10 has path => (is => 'ro', required => 1);
11
12 has mode => (is => 'ro', predicate => 1);
13
14 sub expected_effect {
15   my ($self) = @_;
16   return +(path_status => PathStatus->new(
17     path => $self->path,
18     info => PathStatusInfo->new(
19       is_file => 1,
20       mode => ($self->has_mode ? $self->mode : '')
21     )
22   ));
23 }
24
25 sub _do_run {
26   my ($self) = @_;
27   my $fh;
28   if ($self->has_mode) {
29     my $umask = umask(0000);
30     sysopen(
31       $fh, $self->path, O_CREAT | O_WRONLY, oct($self->mode)
32     ) or do { umask($umask); die "Couldn't create ${\$self->path}: $!" };
33     umask($umask);
34   } else {
35     sysopen($fh, $self->path, O_CREAT | O_WRONLY)
36       or die "Couldn't create ${\$self->path}: $!";
37   }
38   +(path_status => PathStatus->new(path => $self->path));
39 }
40
41 1;