use std::io::{self, Read, Write};
use crate::stream::Transport;
use super::FrameBuf;
pub(crate) struct ZMTP {
transport: Transport,
}
impl ZMTP {
pub fn connect<F>(produce_transport: F) -> io::Result<Self>
where
F: FnOnce() -> io::Result<Transport>,
{
let transport = produce_transport()?;
Ok(Self {
transport,
})
}
pub fn greet(mut self, (_major, _minor, _): (u8, u8, u8), as_server: bool) -> io::Result<Self> {
let (partial, remaining) = {
let mut greeting = crate::codec::Greeting::build();
greeting.as_server(as_server);
greeting.into_parts()
};
self.transport.write(&partial)?;
{
let mut buf = [0u8; 12];
let n = self.transport.read(&mut buf)?;
assert_eq!(n, 12, "{:?}", buf);
}
self.transport.write(&remaining)?;
Ok(self)
}
pub fn ready<'b>(self, socket_type: &'b str) -> io::Result<Transport> {
let Self { mut transport, .. } = self;
{
let mut buf = [0u8; 52];
let n = transport.read(&mut buf[..])?;
assert_eq!(n, 52);
let mut buf = [0u8; 64];
let _n = transport.read(&mut buf)?;
}
let handshake = {
let properties = vec![("Socket-Type", socket_type)];
FrameBuf::short_command("READY", Some(properties))
};
transport.write(handshake.as_ref())?;
Ok(transport)
}
}