package Feed::Role::MailDir;
use Moose::Role;
use 5.012;
use namespace::autoclean;
use Encode;
use Encode::IMAPUTF7;
use MooseX::Types::Path::Class 'Dir';
use Maildir::Lite;
with 'Feed::HelperRole::Mail';
requires 'extract_entries';
has maildir_base => (
is => 'ro',
isa => Dir,
coerce => 1,
required => 1,
);
has maildir_folder => (
is => 'ro',
isa => 'Maildir::Lite',
lazy_build => 1,
);
sub _build_maildir_folder {
my ($self) = @_;
my $feed = $self->feed;
my $folder = encode('IMAP-UTF-7',$self->maildir_folder_for($feed));
$self->maildir_base->mkpath;
return Maildir::Lite->new(
dir => $self->maildir_base->subdir($folder)->stringify,
);
}
sub process_entry {
my ($self,$entry) = @_;
my ($msg) = $self->entry_to_mime($entry);
$self->store_into_maildir($msg);
return;
}
sub _clean_folder_part {
return map { my $a=$_;$a=~s{\W+}{-}g;$a } @_;
}
sub maildir_folder_for {
my ($self,$feed) = @_;
my (@comps) = _clean_folder_part($self->mail_folders,$self->title);
return join '.','',@comps;
}
sub store_into_maildir {
my ($self,$msg) = @_;
my ($fh,$stat) = $self->maildir_folder->creat_message();
die "maildir create message failed ($stat)" if $stat;
binmode($fh);
$msg->print($fh)
or die "print to maildir failed: $!";
$self->maildir_folder->deliver_message($fh)
and die "maildir write failed";
}
1;