cig 0.1.2

Simplify TCP/IP applications with a transparential, persistent-mode and data-driven protocol
Documentation
use std::{io, net::ToSocketAddrs};

use serde::{de::DeserializeOwned, Serialize};

use crate::{conn::Conn, pkg::Pkg};

pub struct Smoke<T, S, F>
where
    T: DeserializeOwned + Serialize,
    F: FnMut(&mut Conn<T>, &mut S, Pkg<T>),
{
    pub conn: Conn<T>,
    pub state: S,
    pub handler: F,
}

impl<T, S, F> Smoke<T, S, F>
where
    T: DeserializeOwned + Serialize,
    F: FnMut(&mut Conn<T>, &mut S, Pkg<T>),
{
    pub fn connect<A>(addr: A, state: S, handler: F) -> io::Result<Self>
    where
        A: ToSocketAddrs,
    {
        let s = Self {
            conn: Conn::connect(addr)?,
            state,
            handler,
        };
        Ok(s)
    }

    pub fn host<A>(addr: A, state: S, handler: F) -> io::Result<Self>
    where
        A: ToSocketAddrs,
    {
        let s = Self {
            conn: Conn::host(addr)?,
            state,
            handler,
        };
        Ok(s)
    }

    pub fn connect_or_host<A>(addr: A, state: S, handler: F) -> io::Result<Self>
    where
        A: ToSocketAddrs,
    {
        let s = Self {
            conn: Conn::host(&addr).or_else(|_| Conn::connect(addr))?,
            state,
            handler,
        };
        Ok(s)
    }

    pub fn poll(&mut self) {
        match self.conn.poll() {
            Ok(Some(p)) => (self.handler)(&mut self.conn, &mut self.state, p),
            Ok(None) => (),
            Err(e) => panic!("polling error: {e:?}"),
        }
    }
}