summaryrefslogtreecommitdiffstats
path: root/headers/src/header_components/received_token.rs
diff options
context:
space:
mode:
Diffstat (limited to 'headers/src/header_components/received_token.rs')
-rw-r--r--headers/src/header_components/received_token.rs97
1 files changed, 97 insertions, 0 deletions
diff --git a/headers/src/header_components/received_token.rs b/headers/src/header_components/received_token.rs
new file mode 100644
index 0000000..5c9ff5a
--- /dev/null
+++ b/headers/src/header_components/received_token.rs
@@ -0,0 +1,97 @@
+use soft_ascii_string::SoftAsciiChar;
+
+use internals::error::EncodingError;
+use internals::encoder::{EncodingWriter, EncodableInHeader};
+
+use super::word::{ Word, do_encode_word };
+use super::{ Email, Domain };
+
+
+#[derive(Debug, Clone, Hash, Eq, PartialEq)]
+pub enum ReceivedToken {
+ Word( Word ),
+ Address( Email ),
+ Domain( Domain )
+}
+
+impl EncodableInHeader for ReceivedToken {
+
+ fn encode(&self, handle: &mut EncodingWriter) -> Result<(), EncodingError> {
+ use self::ReceivedToken::*;
+ match *self {
+ Word( ref word ) => {
+ do_encode_word( word, handle, None )?;
+ },
+ Address( ref addr ) => {
+ // we do not need to use <..> , but I think it's better and it is definitely
+ // not wrong
+ handle.write_char( SoftAsciiChar::from_unchecked('<') )?;
+ addr.encode( handle )?;
+ handle.write_char( SoftAsciiChar::from_unchecked('>') )?;
+ },
+ Domain( ref domain ) => {
+ domain.encode( handle )?;
+ }
+ }
+ Ok( () )
+ }
+
+ fn boxed_clone(&self) -> Box<EncodableInHeader> {
+ Box::new(self.clone())
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use ::HeaderTryFrom;
+ use internals::MailType;
+ use internals::encoder::EncodingBuffer;
+ use super::*;
+
+ ec_test!{ a_domain, {
+ Domain::try_from( "random.mailnot" )?
+ } => ascii => [
+ MarkFWS,
+ Text "random.mailnot",
+ MarkFWS
+ ]}
+
+ ec_test!{ a_address, {
+ let email = Email::try_from( "modnar@random.mailnot")?;
+ ReceivedToken::Address( email )
+ } => ascii => [
+ Text "<",
+ MarkFWS,
+ Text "modnar",
+ MarkFWS,
+ Text "@",
+ MarkFWS,
+ Text "random.mailnot",
+ MarkFWS,
+ Text ">"
+ ]}
+
+ ec_test!{ a_word, {
+ let word = Word::try_from( "simple" )?;
+ ReceivedToken::Word( word )
+ } => ascii => [
+ Text "simple"
+ ]}
+
+ ec_test!{ a_quoted_word, {
+ let word = Word::try_from( "sim ple" )?;
+ ReceivedToken::Word( word )
+ } => ascii => [
+ Text r#""sim ple""#
+ ]}
+
+
+ #[test]
+ fn no_encoded_word() {
+ let mut encoder = EncodingBuffer::new( MailType::Ascii );
+ let mut handle = encoder.writer();
+ let input = ReceivedToken::Word( Word::try_from( "↓right" ).unwrap() );
+ assert_err!(input.encode( &mut handle ));
+ handle.undo_header();
+ }
+} \ No newline at end of file