use crate::{
ZmqResult, sealed,
socket::{Socket, SocketOption, SocketType},
};
pub type ServerSocket = Socket<Server>;
pub struct Server {}
impl sealed::SenderFlag for Server {}
impl sealed::ReceiverFlag for Server {}
impl sealed::SocketType for Server {
fn raw_socket_type() -> SocketType {
SocketType::Server
}
}
unsafe impl Sync for Socket<Server> {}
unsafe impl Send for Socket<Server> {}
impl Socket<Server> {
pub fn set_hello_message<V>(&self, value: V) -> ZmqResult<()>
where
V: AsRef<str>,
{
self.set_sockopt_string(SocketOption::HelloMessage, value)
}
pub fn set_disconnect_message<V>(&self, value: V) -> ZmqResult<()>
where
V: AsRef<str>,
{
self.set_sockopt_string(SocketOption::DisconnectMessage, value)
}
}
#[cfg(test)]
mod server_tests {
use super::ServerSocket;
use crate::prelude::{Context, ZmqResult};
#[test]
fn set_hello_message_sets_hello_message() -> ZmqResult<()> {
let context = Context::new()?;
let socket = ServerSocket::from_context(&context)?;
socket.set_hello_message("hello")?;
Ok(())
}
#[test]
fn set_disconnect_message_sets_disconnect_message() -> ZmqResult<()> {
let context = Context::new()?;
let socket = ServerSocket::from_context(&context)?;
socket.set_disconnect_message("bye")?;
Ok(())
}
}
#[cfg(feature = "builder")]
pub(crate) mod builder {
use core::default::Default;
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use super::ServerSocket;
use crate::{ZmqResult, context::Context, socket::SocketBuilder};
#[derive(Default, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, Builder)]
#[builder(
pattern = "owned",
name = "ServerBuilder",
public,
build_fn(skip, error = "ZmqError"),
derive(PartialEq, Eq, Hash, Clone, serde::Serialize, serde::Deserialize)
)]
#[builder_struct_attr(doc = "Builder for [`ServerSocket`].\n\n")]
#[allow(dead_code)]
struct ServerConfig {
socket_builder: SocketBuilder,
#[builder(setter(into), default = "Default::default()")]
hello_message: String,
#[builder(setter(into), default = "Default::default()")]
disconnect_message: String,
}
impl ServerBuilder {
pub fn apply(self, socket: &ServerSocket) -> ZmqResult<()> {
if let Some(socket_builder) = self.socket_builder {
socket_builder.apply(socket)?;
}
self.hello_message
.iter()
.try_for_each(|hello_message| socket.set_hello_message(hello_message))?;
self.disconnect_message
.iter()
.try_for_each(|disconnect_message| {
socket.set_disconnect_message(disconnect_message)
})?;
Ok(())
}
pub fn build_from_context(self, context: &Context) -> ZmqResult<ServerSocket> {
let socket = ServerSocket::from_context(context)?;
self.apply(&socket)?;
Ok(socket)
}
}
#[cfg(test)]
mod server_builder_tests {
use super::ServerBuilder;
use crate::prelude::{Context, SocketBuilder, ZmqResult};
#[test]
fn default_server_builder() -> ZmqResult<()> {
let context = Context::new()?;
ServerBuilder::default().build_from_context(&context)?;
Ok(())
}
#[test]
fn server_builder_with_custom_values() -> ZmqResult<()> {
let context = Context::new()?;
ServerBuilder::default()
.socket_builder(SocketBuilder::default())
.hello_message("hello")
.disconnect_message("byebye")
.build_from_context(&context)?;
Ok(())
}
}
}