pop3_client/
request.rs

1#[derive(Debug, Eq, PartialEq)]
2pub enum Command<'a> {
3    Apop { id: &'a str, token: &'a str },
4    Auth,
5    Noop,
6    Uidl { id: Option<u64>},
7    Top  { id: u64, lines: u64 },
8    Dele { id: u64 },
9    Retr { id: u64},
10    Rset,
11    List { id: Option<u64>},
12    Stat,
13    User { data: &'a str },
14    Pass { data: &'a str },
15    Quit,
16    Capa,
17    Greet,
18}
19
20impl<'a> Command <'a> {
21    pub fn is_response_multiline(&self) -> bool {
22        match self {
23            Self::Top   { .. } => true,
24            Self::Retr  { .. } => true,
25            Self::List  { id } => id.is_none(),
26            Self::Uidl  { id } => id.is_none(),
27            _ => {
28                false
29            }
30        }
31    }
32
33    pub fn to_request(&self) -> String {
34        match self {
35            Self::Apop { id, token } => format!("APOP {id} {token}\r\n"),
36            Self::Auth               => "".into(),
37            Self::Capa               => "CAPA".into(),
38            Self::Greet => "".into(),
39            Self::User { data }      => format!("USER {data}\r\n"),
40            Self::Pass { data }      => format!("PASS {data}\r\n"),
41            Self::Noop               => "NOOP\r\n".into(),
42            Self::Top  { id, lines } => format!("TOP {id} {lines}\r\n"),
43            Self::Dele { id }        => format!("DELE {id}\r\n"),
44            Self::Retr { id }        => format!("RETR {id}\r\n"),
45            Self::Rset               => "RSET\r\n".into(),
46            Self::List { id }        => if let Some(v) = id {format!("LIST {v}\r\n")} else {"LIST\r\n".into()},
47            Self::Stat               => "STAT\r\n".into(),
48            Self::Uidl { id }        => if let Some(v) = id {format!("UIDL {v}\r\n")} else {"UIDL\r\n".into()},
49            Self::Quit               => "QUIT\r\n".into(),
50        }
51    }
52}
53