refactor Lib::FS
[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::FileContent';
4 use aliased 'DX::Lib::FS::Fact::PathStatus';
5 use aliased 'DX::Lib::FS::Fact::PathStatusInfo';
6 use Fcntl qw(O_CREAT O_WRONLY);
7 use Moo;
8
9 with 'DX::Role::Action';
10
11 has path => (is => 'ro', required => 1);
12
13 has mode => (is => 'ro', predicate => 1);
14
15 has data => (is => 'ro', default => sub { '' });
16
17 sub expected_effect {
18   my ($self) = @_;
19   return +(path_status => PathStatus->new(
20     path => $self->path,
21     info => PathStatusInfo->new(
22       is_file => 1,
23       mode => ($self->has_mode ? $self->mode : '')
24     )
25   ), file_content => FileContent->new(
26     path => $self->path,
27     data => $self->data,
28   ));
29 }
30
31 sub _do_run {
32   my ($self) = @_;
33   my $fh;
34   if ($self->has_mode) {
35     my $umask = umask(0000);
36     sysopen(
37       $fh, $self->path, O_CREAT | O_WRONLY, oct($self->mode)
38     ) or do { umask($umask); die "Couldn't create ${\$self->path}: $!" };
39     umask($umask);
40   } else {
41     sysopen($fh, $self->path, O_CREAT | O_WRONLY)
42       or die "Couldn't create ${\$self->path}: $!";
43   }
44   print $fh $self->data if length($self->data);
45   +(path_status => PathStatus->new(path => $self->path));
46 }
47
48 sub but_add {
49   $_[0]->but(data => $_[0]->data.$_[1]."\n")
50 }
51
52 1;