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:?}"),
}
}
}