diff options
author | dakkar <dakkar@thenautilus.net> | 2016-06-10 13:13:24 +0100 |
---|---|---|
committer | dakkar <dakkar@thenautilus.net> | 2016-06-10 13:13:24 +0100 |
commit | bbc8e2aaab621464c0530d613b18cb5ee8c13290 (patch) | |
tree | fa2e3a58292d198c22865d1fdf6b396b6ac47acb /lib | |
parent | some skeleton (diff) | |
download | Sietima-bbc8e2aaab621464c0530d613b18cb5ee8c13290.tar.gz Sietima-bbc8e2aaab621464c0530d613b18cb5ee8c13290.tar.bz2 Sietima-bbc8e2aaab621464c0530d613b18cb5ee8c13290.zip |
passes its first test!
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Sietima.pm | 56 | ||||
-rw-r--r-- | lib/Sietima/Message.pm | 6 | ||||
-rw-r--r-- | lib/Sietima/Subscriber.pm | 22 | ||||
-rw-r--r-- | lib/Sietima/Types.pm | 33 |
4 files changed, 94 insertions, 23 deletions
diff --git a/lib/Sietima.pm b/lib/Sietima.pm index 85468bb..2049d2c 100644 --- a/lib/Sietima.pm +++ b/lib/Sietima.pm @@ -3,46 +3,60 @@ use 5.020; use Moo; use Types::Standard qw(ArrayRef Object FileHandle Maybe); use Type::Params qw(compile); -use Sietima::Types qw(Address EmailMIME Message Subscriber Transport); +use Sietima::Types qw(Address AddressFromStr + EmailMIME Message + Subscriber SubscriberFromAddress SubscriberFromStr + Transport); use Sietima::Message; -use Email::Sender::Simple qw(sendmail); +use Sietima::Subscriber; +use Email::Sender::Simple qw(); +use Email::Sender; +use Email::Address; use namespace::clean; has return_path => ( isa => Address, is => 'ro', required => 1, + coerce => AddressFromStr, ); +my $subscribers_array = ArrayRef[ + Subscriber->plus_coercions( + SubscriberFromAddress, + SubscriberFromStr, + ) +]; has subscribers => ( - isa => ArrayRef[Subscriber], + isa => $subscribers_array, is => 'lazy', + coerce => $subscribers_array->coercion, ); sub _build_subscribers { +[] } has transport => ( - isa => Maybe[Transport], + isa => Transport, is => 'lazy', ); -sub _build_transport { } +sub _build_transport { Email::Sender::Simple->default_transport } -sub handle_message { - state $check = compile(Obect,EmailMIME); - my ($self,$incoming_message) = $check->(@_); +sub handle_mail { + state $check = compile(Object,EmailMIME); + my ($self,$incoming_mail) = $check->(@_); - my (@outgoing_messages) = $self->munge_message($incoming_message); + my (@outgoing_messages) = $self->munge_mail($incoming_mail); for my $outgoing_message (@outgoing_messages) { $self->send_message($outgoing_message); } return; } -sub munge_message { - state $check = compile(Obect,EmailMIME); - my ($self,$incoming_message) = $check->(@_); +sub munge_mail { + state $check = compile(Object,EmailMIME); + my ($self,$incoming_mail) = $check->(@_); return Sietima::Message->new({ - mail => $incoming_message, + mail => $incoming_mail, from => $self->return_path, to => [ map { $_->address } @{$self->subscribers} @@ -51,16 +65,16 @@ sub munge_message { } sub send_message { - state $check = compile(Obect,Message); + state $check = compile(Object,Message); my ($self,$outgoing_message) = $check->(@_); - sendmail( - $outgoing_message->mail, - { - %{$outgoing_message->envelope}, - transport => $self->transport, - }, - ); + my $envelope = $outgoing_message->envelope; + if ($envelope->{to} && @{$envelope->{to}}) { + $self->transport->send( + $outgoing_message->mail, + $envelope, + ); + } return; } diff --git a/lib/Sietima/Message.pm b/lib/Sietima/Message.pm index 547077a..7202269 100644 --- a/lib/Sietima/Message.pm +++ b/lib/Sietima/Message.pm @@ -2,7 +2,7 @@ package Sietima::Message; use 5.020; use Moo; use Types::Standard qw(ArrayRef Object); -use Sietima::Types qw(Address EmailMIME); +use Sietima::Types qw(Address AddressFromStr EmailMIME); use Email::MIME; use namespace::clean; @@ -18,9 +18,11 @@ has from => ( required => 1, ); +my $address_array = ArrayRef[Address->plus_coercions(AddressFromStr)]; has to => ( + isa => $address_array, is => 'ro', - isa => ArrayRef[Address], + coerce => $address_array->coercion, required => 1, ); diff --git a/lib/Sietima/Subscriber.pm b/lib/Sietima/Subscriber.pm new file mode 100644 index 0000000..cb71513 --- /dev/null +++ b/lib/Sietima/Subscriber.pm @@ -0,0 +1,22 @@ +package Sietima::Subscriber; +use 5.020; +use Moo; +use Types::Standard qw(HashRef); +use Sietima::Types qw(Address AddressFromStr); +use namespace::clean; + +has raw_address => ( + isa => Address, + is => 'ro', + required => 1, + coerce => AddressFromStr, + handles => [qw(address name original)], +); + +has prefs => ( + isa => HashRef, + is => 'ro', + default => sub { +{} }, +); + +1; diff --git a/lib/Sietima/Types.pm b/lib/Sietima/Types.pm new file mode 100644 index 0000000..95d1f88 --- /dev/null +++ b/lib/Sietima/Types.pm @@ -0,0 +1,33 @@ +package Sietima::Types; +use 5.020; +use strict; +use warnings; +use Type::Utils -all; +use Types::Standard qw(Str); +use namespace::clean; +use Type::Library + -base, + -declare => qw(Address AddressFromStr + EmailMIME Message + Subscriber SubscriberFromAddress SubscriberFromStr + Transport); + +class_type EmailMIME, { class => 'Email::MIME' }; +role_type Transport, { role => 'Email::Sender::Transport' }; + +class_type Address, { class => 'Email::Address' }; +declare_coercion AddressFromStr, + to_type Address, from Str, + q{ (Email::Address->parse($_))[0] }; + +class_type Message, { class => 'Sietima::Message' }; + +class_type Subscriber, { class => 'Sietima::Subscriber' }; +declare_coercion SubscriberFromAddress, + to_type Subscriber, from Address, + q{ Sietima::Subscriber->new(raw_address=>$_) }; +declare_coercion SubscriberFromStr, + to_type Subscriber, from Str, + q{ Sietima::Subscriber->new(raw_address=>(Email::Address->parse($_))[0]) }; + +1; |