summaryrefslogtreecommitdiffstats
path: root/headers/src/header_components/received_token.rs
blob: 5c9ff5a597b13b0f07a7c15402549fab0d095af9 (plain)
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();
    }
}