use core::fmt::Debug;
use alloc::format;
use iceoryx2_bb_elementary_traits::zero_copy_send::ZeroCopySend;
use iceoryx2_log::fail;
use crate::{
port::{
DegradationAction, DegradationFn, DegradationHandler,
subscriber::{Subscriber, SubscriberCreateError},
},
service,
};
use super::publish_subscribe::PortFactory;
#[derive(Debug)]
pub(crate) struct SubscriberConfig {
pub(crate) buffer_size: Option<usize>,
pub(crate) degradation_handler: DegradationHandler<'static>,
}
#[derive(Debug)]
pub struct PortFactorySubscriber<
'factory,
Service: service::Service,
PayloadType: Debug + ZeroCopySend + ?Sized,
UserHeader: Debug + ZeroCopySend,
> {
config: SubscriberConfig,
pub(crate) factory: &'factory PortFactory<Service, PayloadType, UserHeader>,
}
unsafe impl<
Service: service::Service,
Payload: Debug + ZeroCopySend + ?Sized,
UserHeader: Debug + ZeroCopySend,
> Send for PortFactorySubscriber<'_, Service, Payload, UserHeader>
{
}
impl<
'factory,
Service: service::Service,
PayloadType: Debug + ZeroCopySend + ?Sized,
UserHeader: Debug + ZeroCopySend,
> PortFactorySubscriber<'factory, Service, PayloadType, UserHeader>
{
#[doc(hidden)]
pub unsafe fn __internal_partial_clone(&self) -> Self {
Self {
config: SubscriberConfig {
buffer_size: self.config.buffer_size,
degradation_handler: DegradationHandler::new_with(DegradationAction::Warn),
},
factory: self.factory,
}
}
pub(crate) fn new(factory: &'factory PortFactory<Service, PayloadType, UserHeader>) -> Self {
Self {
config: SubscriberConfig {
buffer_size: None,
degradation_handler: DegradationHandler::new_with(DegradationAction::Warn),
},
factory,
}
}
pub fn buffer_size(mut self, value: usize) -> Self {
self.config.buffer_size = Some(value.max(1));
self
}
pub fn set_degradation_handler<F: DegradationFn + 'static>(mut self, handler: F) -> Self {
self.config.degradation_handler = DegradationHandler::new(handler);
self
}
pub fn create(
self,
) -> Result<Subscriber<Service, PayloadType, UserHeader>, SubscriberCreateError> {
let origin = format!("{self:?}");
Ok(
fail!(from origin, when Subscriber::new(self.factory.service.clone(), self.factory.service.static_config().publish_subscribe(), self.config),
"Failed to create new Subscriber port."),
)
}
}