zzrpc 0.1.3

RPC over mezzenger transports.
Documentation
use std::{sync::Arc, time::Duration};

use anyhow::Result;
use futures::StreamExt;
use kodec::binary::Codec;
use mezzenger_tcp::Transport;
use tokio::{net::TcpStream, spawn, time::sleep};
use zzrpc::Consume;

use crate::api::{Api, Consumer};

pub async fn run(address: &str) -> Result<()> {
    println!("Connecting to server...");
    let stream = TcpStream::connect(address).await?;
    let codec = Codec::default();
    let transport = Transport::new(stream, codec);

    let consumer = Consumer::consume(transport, Default::default());
    println!("Connected.");

    consumer.hello_world().await.unwrap();

    println!("2 + 3 = {}", consumer.add_numbers(2, 3).await.unwrap());

    sleep(Duration::from_secs(1)).await;

    println!("2 + 3 = {}", consumer.add_numbers(2, 3).await.unwrap());

    let consumer = Arc::new(consumer);

    let mut addition = consumer.add_numbers(2, 3);
    let aborter = addition.aborter();
    spawn(async move {
        sleep(Duration::from_secs(1)).await;
        println!("2 + 3 = {:?}", addition.await);
    });
    aborter.abort();

    println!("5 + 6 = {}", consumer.add_numbers(5, 6).await.unwrap());
    println!(
        "'abc' + 'df' = {}",
        consumer
            .concatenate_strings("abc".to_string(), "df".to_string())
            .await
            .unwrap()
    );
    println!("8 + 1 = {}", consumer.add_numbers(8, 1).await.unwrap());

    let mut time_stream = consumer.stream_time(Duration::from_secs(1)).await.unwrap();
    let aborter = time_stream.aborter();
    let consumer_clone = consumer.clone();
    spawn(async move {
        sleep(Duration::from_secs(2)).await;
        println!(
            "45 + 6 = {}",
            consumer_clone.add_numbers(45, 6).await.unwrap()
        );
        sleep(Duration::from_secs(5)).await;
        aborter.abort();
    });

    while let Some(time) = time_stream.next().await {
        println!("Time: {time}");
    }

    println!("2 + 3 = {}", consumer.add_numbers(2, 3).await.unwrap());

    Ok(())
}