File: server.rs

package info (click to toggle)
rust-imap-next 0.3.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 496 kB
  • sloc: makefile: 2; sh: 1
file content (52 lines) | stat: -rw-r--r-- 1,568 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
use std::collections::VecDeque;

use imap_next::{
    imap_types::response::{Greeting, Status},
    server::{Event, Options, Server},
    stream::Stream,
};
use tokio::net::TcpListener;

#[tokio::main(flavor = "current_thread")]
async fn main() {
    let listener = TcpListener::bind("127.0.0.1:12345").await.unwrap();
    let (stream, _) = listener.accept().await.unwrap();
    let mut stream = Stream::insecure(stream);
    let mut server = Server::new(
        Options::default(),
        Greeting::ok(None, "server (example)").unwrap(),
    );

    loop {
        match stream.next(&mut server).await.unwrap() {
            Event::GreetingSent { greeting } => {
                println!("greeting sent: {greeting:?}");
                break;
            }
            event => println!("unexpected event: {event:?}"),
        }
    }

    let mut handles = VecDeque::new();

    loop {
        match stream.next(&mut server).await.unwrap() {
            Event::CommandReceived { command } => {
                println!("command received: {command:?}");
                handles.push_back(
                    server.enqueue_status(Status::no(Some(command.tag), None, "...").unwrap()),
                );
            }
            Event::ResponseSent {
                handle: got_handle,
                response,
            } => {
                println!("response sent: {response:?}");
                assert_eq!(handles.pop_front(), Some(got_handle));
            }
            event => {
                println!("{event:?}");
            }
        }
    }
}