mail_internals/bind/encoded_word/
impls.rs

1use soft_ascii_string::{ SoftAsciiString, SoftAsciiChar, SoftAsciiStr };
2
3use vec1::Vec1;
4use grammar::encoded_word::{ MAX_ECW_LEN, ECW_SEP_OVERHEAD };
5use ::encoder::EncodingWriter;
6use super::{ EncodedWordWriter, EncodedWordEncoding as Encoding };
7
8pub struct VecWriter<'a> {
9    data: Vec1<SoftAsciiString >,
10    charset: &'a SoftAsciiStr,
11    encoding: Encoding
12}
13
14impl<'a> VecWriter<'a> {
15    pub fn new(charset: &'a SoftAsciiStr, encoding: Encoding) -> Self {
16        let data = Vec1::new( SoftAsciiString::new() );
17        VecWriter { data, charset, encoding }
18    }
19
20    pub fn data( &self ) -> &[SoftAsciiString] {
21        &*self.data
22    }
23}
24
25impl<'a> Into<Vec1<SoftAsciiString>> for VecWriter<'a> {
26    fn into(self) -> Vec1<SoftAsciiString> {
27        self.data
28    }
29}
30
31impl<'a> EncodedWordWriter for VecWriter<'a> {
32
33    fn encoding( &self ) -> Encoding {
34        self.encoding
35    }
36
37    fn write_char( &mut self, ch: SoftAsciiChar ) {
38        self.data.last_mut().push( ch );
39    }
40
41    fn write_charset( &mut self ) {
42        self.data.last_mut().extend( self.charset.chars() )
43    }
44
45    fn write_ecw_seperator( &mut self ) {
46        self.data.push( SoftAsciiString::new() )
47    }
48
49    fn max_payload_len( &self ) -> usize {
50        MAX_ECW_LEN - ECW_SEP_OVERHEAD - self.charset.len() - 1
51    }
52}
53
54pub struct WriterWrapper<'a, 'b: 'a>{
55    charset: &'a SoftAsciiStr,
56    encoding: Encoding,
57    encoder_handle: &'a mut EncodingWriter<'b>
58}
59
60impl<'a, 'b: 'a> WriterWrapper<'a, 'b> {
61    pub fn new_with_charset(charset: &'a SoftAsciiStr,
62                            encoding: Encoding,
63                            encoder: &'a mut EncodingWriter<'b> ) -> Self
64    {
65        WriterWrapper { charset, encoding, encoder_handle: encoder }
66    }
67
68    pub fn new(encoding: Encoding,
69               encoder: &'a mut EncodingWriter<'b> ) -> Self
70    {
71        Self::new_with_charset(SoftAsciiStr::from_unchecked("utf8"), encoding, encoder)
72    }
73}
74
75impl<'a, 'b: 'a> EncodedWordWriter for WriterWrapper<'a, 'b> {
76
77    fn encoding( &self ) -> Encoding {
78        self.encoding
79    }
80
81    fn write_charset( &mut self ) {
82        //TODO fix
83        let _ = self.encoder_handle.write_str( self.charset );
84    }
85
86    fn write_ecw_seperator( &mut self ) {
87        self.encoder_handle.write_fws();
88    }
89
90    fn write_char( &mut self, ch: SoftAsciiChar ) {
91        //TODO fix
92        let _ = self.encoder_handle.write_char( ch );
93    }
94
95    fn max_payload_len( &self ) -> usize {
96        MAX_ECW_LEN - ECW_SEP_OVERHEAD - self.charset.len() - 1
97    }
98}