rip_starttls/imap/
std.rs

1//! # Std
2//!
3//! This module contains the blocking, standard I/O connector for
4//! [`RipStarttls`](super::RipStarttls).
5
6use std::{
7    io::{BufRead, BufReader, Result, Write},
8    net::TcpStream,
9};
10
11use super::{Event, State};
12
13#[derive(Clone, Debug, Default, Eq, PartialEq)]
14pub struct RipStarttls {
15    state: super::RipStarttls,
16}
17
18impl RipStarttls {
19    pub fn new(handshake_discarded: bool) -> Self {
20        let state = super::RipStarttls::new(handshake_discarded);
21        Self { state }
22    }
23
24    pub fn do_starttls_prefix(mut self, mut stream: TcpStream) -> Result<TcpStream> {
25        let mut event = None;
26
27        while let Some(output) = self.state.resume(event.take()) {
28            match output {
29                State::DiscardHandshake => {
30                    let mut line = String::new();
31                    let mut reader = BufReader::new(stream);
32                    reader.read_line(&mut line)?;
33                    event = Some(Event::HandshakeDiscarded(line));
34                    stream = reader.into_inner();
35                }
36                State::WriteStarttlsCommand => {
37                    let cmd = super::RipStarttls::COMMAND;
38                    let count = stream.write(cmd.as_bytes())?;
39                    event = Some(Event::StarttlsCommandWrote(count));
40                }
41                State::DiscardResponse => {
42                    let mut line = String::new();
43                    let mut reader = BufReader::new(stream);
44                    reader.read_line(&mut line)?;
45                    event = Some(Event::ResponseDiscarded(line));
46                    stream = reader.into_inner();
47                }
48            }
49        }
50
51        Ok(stream)
52    }
53}