From acce31d4c6e8f3118ee1ba8db70cf3386c3161a0 Mon Sep 17 00:00:00 2001 From: Alexis Mousset Date: Fri, 12 Dec 2014 19:25:49 +0100 Subject: [PATCH] Specifiy types for common headers --- src/mailer/header.rs | 67 ++++++++++++++++++++++++++++++++++++++------ src/mailer/mod.rs | 16 +++++------ 2 files changed, 67 insertions(+), 16 deletions(-) diff --git a/src/mailer/header.rs b/src/mailer/header.rs index 210ec05..6b2d841 100644 --- a/src/mailer/header.rs +++ b/src/mailer/header.rs @@ -9,9 +9,12 @@ //! Simple SMTP headers +use time::Tm; + use std::fmt::{Show, Formatter, Result}; use common::{SP, COLON}; +use mailer::address::Address; /// Converts to an `Header` pub trait ToHeader { @@ -34,23 +37,71 @@ impl<'a> ToHeader for (&'a str, &'a str) { /// Contains a header #[deriving(PartialEq,Eq,Clone)] -pub struct Header { - /// Name of the header - name: String, - /// Value of the header - value: String, +pub enum Header { + /// `To` + To(Address), + /// `From` + From(Address), + /// `Cc` + Cc(Address), + /// `Reply-To` + ReplyTo(Address), + /// `Sender` + Sender(String), + /// `Date` + Date(Tm), + /// `Subject` + Subject(String), + /// `MIME-Version` + MimeVersion(String), + /// `Content-Type` + ContentType(String), + /// `Message-Id` + MessageId(String), + /// Any header (name, value) + Other(String, String), } impl Show for Header { fn fmt(&self, f: &mut Formatter) -> Result { - f.write(format!("{}{}{}{}", self.name, COLON, SP, self.value).as_bytes()) + + f.write(format!("{}{}{}{}", + match *self { + + Header::To(_) => "To", + Header::From(_) => "From", + Header::Cc(_) => "Cc", + Header::ReplyTo(_) => "Reply-To", + Header::Sender(_) => "Sender", + Header::Date(_) => "Date", + Header::Subject(_) => "Subject", + Header::MimeVersion(_) => "MIME-Version", + Header::ContentType(_) => "Content-Type", + Header::MessageId(_) => "Message-Id", + Header::Other(ref name, _) => name.as_slice(), + }, + COLON, SP, + match *self { + Header::To(ref address) => address.to_string(), + Header::From(ref address) => address.to_string(), + Header::Cc(ref address) => address.to_string(), + Header::ReplyTo(ref address) => address.to_string(), + Header::Sender(ref address) => address.to_string(), + Header::Date(ref date) => Tm::rfc822(date).to_string(), + Header::Subject(ref subject) => subject.clone(), + Header::MimeVersion(ref string) => string.clone(), + Header::ContentType(ref string) => string.clone(), + Header::MessageId(ref string) => string.clone(), + Header::Other(_, ref value) => value.clone(), + } + ).as_bytes()) } } impl Header { /// Creates ah `Header` pub fn new(name: &str, value: &str) -> Header { - Header{name: name.to_string(), value: value.to_string()} + Header::Other(name.to_string(), value.to_string()) } } @@ -62,7 +113,7 @@ mod test { fn test_new() { assert_eq!( Header::new("From", "me"), - Header{name: "From".to_string(), value: "me".to_string()} + Header::Other("From".to_string(), "me".to_string()) ); } diff --git a/src/mailer/mod.rs b/src/mailer/mod.rs index 359e707..99874d8 100644 --- a/src/mailer/mod.rs +++ b/src/mailer/mod.rs @@ -73,7 +73,7 @@ impl Email { pub fn from(&mut self, address: A) { self.from = Some(address.to_address().get_address()); self.headers.push( - Header::new("From", address.to_address().to_string().as_slice()) + Header::From(address.to_address()) ); } @@ -81,7 +81,7 @@ impl Email { pub fn to(&mut self, address: A) { self.to.push(address.to_address().get_address()); self.headers.push( - Header::new("To", address.to_address().to_string().as_slice()) + Header::To(address.to_address()) ); } @@ -89,35 +89,35 @@ impl Email { pub fn cc(&mut self, address: A) { self.to.push(address.to_address().get_address()); self.headers.push( - Header::new("Cc", address.to_address().to_string().as_slice()) + Header::Cc(address.to_address()) ); } /// Adds a `Reply-To` header pub fn reply_to(&mut self, address: A) { self.headers.push( - Header::new("Return-Path", address.to_address().to_string().as_slice()) + Header::ReplyTo(address.to_address()) ); } /// Adds a `Subject` header pub fn subject(&mut self, subject: &str) { self.headers.push( - Header::new("Subject", subject) + Header::Subject(subject.to_string()) ); } /// Adds a `Date` header with the current time pub fn date_now(&mut self) { self.headers.push( - Header::new("Date", Tm::rfc822(&now()).to_string().as_slice()) + Header::Date(now()) ); } /// Adds a `Date` header with the current time - pub fn date(&mut self, time: Tm) { + pub fn date(&mut self, date: Tm) { self.headers.push( - Header::new("Date", Tm::rfc822(&time).to_string().as_slice()) + Header::Date(date) ); } }