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