Specifiy types for common headers

This commit is contained in:
Alexis Mousset
2014-12-12 19:25:49 +01:00
parent 3040e4dc70
commit acce31d4c6
2 changed files with 67 additions and 16 deletions
+59 -8
View File
@@ -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())
);
}
+8 -8
View File
@@ -73,7 +73,7 @@ impl Email {
pub fn from<A: ToAddress>(&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<A: ToAddress>(&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<A: ToAddress>(&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<A: ToAddress>(&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)
);
}
}