mail_internals/bind/encoded_word/
impls.rs1use 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 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 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}