lwip 0.3.15

Rust bindings for the lwIP TCP/IP stack
Documentation
use std::{io, pin::Pin};

use futures::sink::Sink;
use futures::stream::Stream;
use futures::task::{Context, Poll};

use super::stack_impl::NetStackImpl;
use super::tcp_listener::TcpListener;
use super::udp::UdpSocket;
use crate::Error;

pub struct NetStack(Box<NetStackImpl>);

impl NetStack {
    pub fn new() -> Result<(Self, TcpListener, Box<UdpSocket>), Error> {
        Ok((
            NetStack(NetStackImpl::new(512)),
            TcpListener::new()?,
            UdpSocket::new(64)?,
        ))
    }

    pub fn with_buffer_size(
        stack_buffer_size: usize,
        udp_buffer_size: usize,
    ) -> Result<(Self, TcpListener, Box<UdpSocket>), Error> {
        Ok((
            NetStack(NetStackImpl::new(stack_buffer_size)),
            TcpListener::new()?,
            UdpSocket::new(udp_buffer_size)?,
        ))
    }
}

impl Stream for NetStack {
    type Item = io::Result<Vec<u8>>;

    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
        Pin::new(&mut self.0).poll_next(cx)
    }
}

impl Sink<Vec<u8>> for NetStack {
    type Error = io::Error;

    fn poll_ready(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
        Pin::new(&mut self.0).poll_ready(cx)
    }

    fn start_send(mut self: Pin<&mut Self>, item: Vec<u8>) -> Result<(), Self::Error> {
        Pin::new(&mut self.0).start_send(item)
    }

    fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
        Pin::new(&mut self.0).poll_flush(cx)
    }

    fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
        Pin::new(&mut self.0).poll_close(cx)
    }
}