Specifiy types for common headers
This commit is contained in:
+59
-8
@@ -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
@@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user