1use imap_codec::{GreetingCodec, ResponseCodec, fragmentizer::Fragmentizer};
2
3#[path = "common/common.rs"]
4mod common;
5
6use common::read_more;
7
8use crate::common::Role;
9
10enum State {
11 Greeting,
12 Response,
13}
14
15const WELCOME: &str = r#"# Parsing of IMAP greeting and responses
16
17"S:" denotes the server.
18".." denotes the continuation of an (incomplete) response, e.g., due to the use of an IMAP literal.
19
20Note: "\n" will be automatically replaced by "\r\n".
21
22--------------------------------------------------------------------------------------------------
23
24Enter intial IMAP greeting followed by IMAP responses (or "exit").
25"#;
26
27fn main() {
28 println!("{WELCOME}");
29
30 let mut fragmentizer = Fragmentizer::new(10 * 1024);
31 let mut state = State::Greeting;
32
33 loop {
34 let Some(_fragment_info) = fragmentizer.progress() else {
36 let bytes = read_more(Role::Server, fragmentizer.message_bytes().is_empty());
38
39 fragmentizer.enqueue_bytes(&bytes);
41
42 continue;
44 };
45
46 if !fragmentizer.is_message_complete() {
48 continue;
50 }
51
52 match state {
54 State::Greeting => {
55 match fragmentizer.decode_message(&GreetingCodec::default()) {
56 Ok(greeting) => {
57 println!("{greeting:#?}");
59
60 state = State::Response;
62 }
63 Err(err) => {
64 println!("Error parsing greeting: {err:?}");
65 }
66 };
67 }
68 State::Response => {
69 match fragmentizer.decode_message(&ResponseCodec::default()) {
70 Ok(response) => {
71 println!("{response:#?}");
73 }
74 Err(err) => {
75 println!("Error parsing response: {err:?}");
76 }
77 };
78 }
79 };
80 }
81}