Skip to content

Commit 677e0df

Browse files
committed
refactor: Refactor examples
1 parent 39118d3 commit 677e0df

File tree

2 files changed

+157
-0
lines changed

2 files changed

+157
-0
lines changed

imap-codec/examples/client.rs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
use imap_codec::{fragmentizer::Fragmentizer, GreetingCodec};
2+
3+
#[path = "common/common.rs"]
4+
mod common;
5+
6+
use common::read_more;
7+
8+
use crate::common::Role;
9+
10+
enum State {
11+
Greeting,
12+
Response,
13+
}
14+
15+
const WELCOME: &str = r#"# Parsing of IMAP greeting and responses
16+
17+
"S:" denotes the server.
18+
19+
Note: "\n" will be automatically replaced by "\r\n".
20+
21+
--------------------------------------------------------------------------------------------------
22+
23+
Enter intial IMAP greeting followed by IMAP responses (or "exit").
24+
"#;
25+
26+
fn main() {
27+
println!("{}", WELCOME);
28+
29+
let mut buffer = Vec::new();
30+
let mut fragmentizer = Fragmentizer::new(10 * 1024);
31+
let mut state = State::Greeting;
32+
33+
loop {
34+
// Progress next message.
35+
fragmentizer.progress();
36+
37+
// Does the Fragmentizer need more bytes?
38+
if fragmentizer.is_message_complete() {
39+
// Read more bytes ...
40+
read_more(&mut buffer, Role::Server);
41+
42+
// ... and pass the bytes to the Fragmentizer ...
43+
fragmentizer.enqueue_bytes(&buffer);
44+
buffer.clear();
45+
46+
// ... and try again.
47+
continue;
48+
}
49+
50+
// The Fragmentizer detected a complete message.
51+
match state {
52+
State::Greeting => {
53+
match fragmentizer.decode_message(&GreetingCodec::default()) {
54+
Ok(greeting) => {
55+
// Do something with the greeting ...
56+
println!("{:#?}", greeting);
57+
58+
// ... and proceed with reponses.
59+
state = State::Response;
60+
}
61+
Err(err) => {
62+
println!("Error parsing greeting: {err:?}");
63+
}
64+
};
65+
}
66+
State::Response => {
67+
match fragmentizer.decode_message(&GreetingCodec::default()) {
68+
Ok(response) => {
69+
// Do something with the response.
70+
println!("{:#?}", response);
71+
}
72+
Err(err) => {
73+
println!("Error parsing response: {err:?}");
74+
}
75+
};
76+
}
77+
};
78+
}
79+
}

imap-codec/examples/server.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
use imap_codec::{
2+
decode::{CommandDecodeError, Decoder},
3+
fragmentizer::{FragmentInfo, Fragmentizer},
4+
CommandCodec,
5+
};
6+
7+
#[path = "common/common.rs"]
8+
mod common;
9+
10+
use common::{read_more, COLOR_SERVER, RESET};
11+
12+
use crate::common::Role;
13+
14+
const WELCOME: &str = r#"# Parsing of IMAP commands
15+
16+
"C:" denotes the client,
17+
"S:" denotes the server, and
18+
".." denotes the continuation of an (incomplete) command, e.g., due to the use of an IMAP literal.
19+
20+
Note: "\n" will be automatically replaced by "\r\n".
21+
22+
--------------------------------------------------------------------------------------------------
23+
24+
Enter IMAP commands (or "exit").
25+
"#;
26+
27+
fn main() {
28+
println!("{}", WELCOME);
29+
30+
let mut buffer = Vec::new();
31+
let mut fragmentizer = Fragmentizer::new(10 * 1024);
32+
33+
// Simulate a greeting.
34+
println!("S: {COLOR_SERVER}* OK ...{RESET}");
35+
36+
loop {
37+
// Progress next message.
38+
let fragment_info = fragmentizer.progress();
39+
40+
// The Fragmentizer detected a line that announces a literal.
41+
// A command continuation request is expected.
42+
if let Some(FragmentInfo::Line {
43+
announcement: Some(_),
44+
..
45+
}) = fragment_info
46+
{
47+
// Simulate a command continuation request ...
48+
println!("S: {COLOR_SERVER}+ {RESET}");
49+
50+
// ... and continue with the remaining message.
51+
continue;
52+
}
53+
54+
// Does the Fragmentizer need more bytes?
55+
if fragmentizer.is_message_complete() {
56+
// Read more bytes ...
57+
read_more(&mut buffer, Role::Server);
58+
59+
// ... and pass the bytes to the Fragmentizer ...
60+
fragmentizer.enqueue_bytes(&buffer);
61+
buffer.clear();
62+
63+
// ... and try again.
64+
continue;
65+
}
66+
67+
// The Fragmentizer detected a complete message.
68+
match fragmentizer.decode_message(&CommandCodec::default()) {
69+
Ok(command) => {
70+
// Do something with the command.
71+
println!("{:#?}", command);
72+
}
73+
Err(err) => {
74+
println!("Error parsing command: {err:?}");
75+
}
76+
};
77+
}
78+
}

0 commit comments

Comments
 (0)