msrt-udp 0.1.0

Tokio UDP adapters for MSRT.
Documentation
use crate::{UdpClient, UdpClientEvent, UdpServer, UdpServerEvent};
use tokio::time::{Duration, sleep};

#[tokio::test]
async fn client_and_server_exchange_message() {
    let mut server = UdpServer::<4>::bind("127.0.0.1:0").await.unwrap();
    let server_addr = server.local_addr().unwrap();
    let mut client = UdpClient::bind("127.0.0.1:0", server_addr).await.unwrap();

    client.connect().unwrap();
    drive(&mut client, &mut server).await;

    client.send(b"hello udp").unwrap();
    let message = drive_until_server_message(&mut client, &mut server).await;

    assert_eq!(message, b"hello udp");
}

async fn drive(client: &mut UdpClient, server: &mut UdpServer<4>) {
    for _ in 0..32 {
        let _ = client.tick().await.unwrap();
        let _ = server.tick().await.unwrap();
        sleep(Duration::from_millis(1)).await;
    }
}

async fn drive_until_server_message(client: &mut UdpClient, server: &mut UdpServer<4>) -> Vec<u8> {
    for _ in 0..64 {
        let _ = client.tick().await.unwrap();
        match server.tick().await.unwrap() {
            UdpServerEvent::Message { message, .. } if message.as_bytes() != [0] => {
                return message.as_bytes().to_vec();
            }
            UdpServerEvent::Message { peer, message } => {
                server.send_to(peer, message.as_bytes()).unwrap();
            }
            UdpServerEvent::SendFailed { peer, .. } => {
                server.disconnect(peer);
            }
            UdpServerEvent::Idle => {}
        }

        match client.tick().await.unwrap() {
            UdpClientEvent::SendFailed(_) => client.disconnect(),
            UdpClientEvent::TransportUnavailable { .. } => client.disconnect(),
            UdpClientEvent::Message(_) | UdpClientEvent::Idle => {}
        }

        sleep(Duration::from_millis(1)).await;
    }

    panic!("message was not delivered");
}