use crate::{
ZmqResult, sealed,
socket::{Socket, SocketOption, SocketType},
};
pub type ClientSocket = Socket<Client>;
pub struct Client {}
impl sealed::SenderFlag for Client {}
impl sealed::ReceiverFlag for Client {}
impl sealed::SocketType for Client {
fn raw_socket_type() -> SocketType {
SocketType::Client
}
}
unsafe impl Sync for Socket<Client> {}
unsafe impl Send for Socket<Client> {}
impl Socket<Client> {
pub fn set_hiccup_message<V>(&self, value: V) -> ZmqResult<()>
where
V: AsRef<str>,
{
self.set_sockopt_string(SocketOption::HiccupMessage, value)
}
pub fn set_hello_message<V>(&self, value: V) -> ZmqResult<()>
where
V: AsRef<str>,
{
self.set_sockopt_string(SocketOption::HelloMessage, value)
}
}
#[cfg(test)]
mod client_tests {
use super::ClientSocket;
use crate::prelude::{Context, ZmqResult};
#[test]
fn set_hello_message_set_hello_msg() -> ZmqResult<()> {
let context = Context::new()?;
let socket = ClientSocket::from_context(&context)?;
socket.set_hello_message("hello123")?;
Ok(())
}
#[test]
fn set_hiccup_message_set_hiccup_msg() -> ZmqResult<()> {
let context = Context::new()?;
let socket = ClientSocket::from_context(&context)?;
socket.set_hiccup_message("hiccup123")?;
Ok(())
}
}
#[cfg(feature = "builder")]
pub(crate) mod builder {
use core::default::Default;
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use super::ClientSocket;
use crate::{ZmqResult, context::Context, socket::SocketBuilder};
#[derive(Default, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Builder)]
#[builder(
pattern = "owned",
name = "ClientBuilder",
public,
build_fn(skip, error = "ZmqError"),
derive(PartialEq, Eq, Hash, Clone, serde::Serialize, serde::Deserialize)
)]
#[builder_struct_attr(doc = "Builder for [`ClientSocket`].\n\n")]
#[allow(dead_code)]
struct ClientConfig {
socket_builder: SocketBuilder,
#[builder(setter(into), default)]
hiccup_msg: String,
#[builder(setter(into), default)]
hello_message: String,
}
impl ClientBuilder {
pub fn apply(self, socket: &ClientSocket) -> ZmqResult<()> {
if let Some(socket_builder) = self.socket_builder {
socket_builder.apply(socket)?;
}
self.hiccup_msg
.iter()
.try_for_each(|hiccup_message| socket.set_hiccup_message(hiccup_message))?;
self.hello_message
.iter()
.try_for_each(|hello_message| socket.set_hello_message(hello_message))?;
Ok(())
}
pub fn build_from_context(self, context: &Context) -> ZmqResult<ClientSocket> {
let socket = ClientSocket::from_context(context)?;
self.apply(&socket)?;
Ok(socket)
}
}
#[cfg(test)]
mod client_builder_tests {
use super::ClientBuilder;
use crate::prelude::{Context, SocketBuilder, ZmqResult};
#[test]
fn default_client_builder() -> ZmqResult<()> {
let context = Context::new()?;
ClientBuilder::default().build_from_context(&context)?;
Ok(())
}
#[test]
fn client_builder_with_custom_values() -> ZmqResult<()> {
let context = Context::new()?;
ClientBuilder::default()
.socket_builder(SocketBuilder::default())
.hello_message("hello123")
.hiccup_msg("hiccup123")
.build_from_context(&context)?;
Ok(())
}
}
}