framez 0.4.0

A zerocopy codec for encoding and decoding data in no_std environments.
Documentation
//! ```not_rust
//! cargo run --example stream
//! ```

use core::{error::Error, pin::pin};
use std::str::FromStr;

use embedded_io_adapters::tokio_1::FromTokio;
use framez::{FramedRead, FramedWrite, codec::lines::StrLines};
use futures::{SinkExt, StreamExt};

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    tracing_subscriber::fmt()
        .with_env_filter("reader=info,writer=info")
        .init();

    let (read, write) = tokio::io::duplex(1024);

    let read_buf = &mut [0u8; 1024];
    let mut framed_read = FramedRead::new(StrLines::new(), FromTokio::new(read), read_buf);

    let reader = async move {
        let stream = framed_read.stream(String::from_str);
        let mut stream = pin!(stream);

        while let Some(item) = stream.next().await.transpose()?.transpose()? {
            tracing::info!(target: "reader", %item, "received frame")
        }

        Ok::<(), Box<dyn Error>>(())
    };

    let write_buf = &mut [0u8; 1024];
    let mut framed_write = FramedWrite::new(StrLines::new(), FromTokio::new(write), write_buf);

    let writer = async move {
        let items = ["Hello, world!", "How are you?", "Goodbye!"];

        let sink = framed_write.sink();
        let mut sink = pin!(sink);

        for item in items {
            tracing::info!(target: "writer", %item, "sending frame");

            sink.send(item).await?;
        }

        Ok::<(), Box<dyn Error>>(())
    };

    let (reader_result, writer_result) = tokio::join!(reader, writer);

    reader_result?;
    writer_result?;

    Ok(())
}