1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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();
}
}
|