use std::{ io::{Read, Write}, net::TcpStream, }; use imap_next::{ client::{Client, Event, Options}, imap_types::{ command::{Command, CommandBody}, core::Tag, }, Interrupt, Io, State, }; fn main() { let mut stream = TcpStream::connect("127.0.0.1:12345").unwrap(); let mut read_buffer = [0; 128]; let mut client = Client::new(Options::default()); let greeting = loop { match client.next() { Err(interrupt) => match interrupt { Interrupt::Io(Io::NeedMoreInput) => { let count = stream.read(&mut read_buffer).unwrap(); client.enqueue_input(&read_buffer[0..count]); } interrupt => panic!("unexpected interrupt: {interrupt:?}"), }, Ok(event) => match event { Event::GreetingReceived { greeting } => break greeting, event => println!("unexpected event: {event:?}"), }, } }; println!("received greeting: {greeting:?}"); let handle = client.enqueue_command(Command { tag: Tag::try_from("A1").unwrap(), body: CommandBody::login("Al¹cE", "pa²²w0rd").unwrap(), }); loop { match client.next() { Err(interrupt) => match interrupt { Interrupt::Io(Io::NeedMoreInput) => { let count = stream.read(&mut read_buffer).unwrap(); client.enqueue_input(&read_buffer[0..count]); } Interrupt::Io(Io::Output(bytes)) => { stream.write_all(&bytes).unwrap(); } Interrupt::Error(error) => { panic!("unexpected error: {error:?}"); } }, Ok(event) => match event { Event::CommandSent { handle: got_handle, command, } => { println!("command sent: {got_handle:?}, {command:?}"); assert_eq!(handle, got_handle); } Event::CommandRejected { handle: got_handle, command, status, } => { println!("command rejected: {got_handle:?}, {command:?}, {status:?}"); assert_eq!(handle, got_handle); } Event::DataReceived { data } => { println!("data received: {data:?}"); } Event::StatusReceived { status } => { println!("status received: {status:?}"); } Event::ContinuationRequestReceived { continuation_request, } => { println!("unexpected continuation request received: {continuation_request:?}"); } event => { println!("{event:?}"); } }, } } }