extern crate alloc;
use super::{client::PortFactoryClient, nodes, server::PortFactoryServer};
use crate::{
identifiers::UniqueServiceId,
node::NodeListFailure,
prelude::AttributeSet,
service::{
self, ServiceState, SharedServiceState, dynamic_config,
resource::request_response::RequestResponseResources, service_hash::ServiceHash,
service_name::ServiceName, static_config,
},
};
use alloc::sync::Arc;
use core::ptr::NonNull;
use core::{fmt::Debug, marker::PhantomData};
use iceoryx2_bb_elementary::CallbackProgression;
use iceoryx2_bb_elementary_traits::zero_copy_send::ZeroCopySend;
use iceoryx2_bb_elementary_traits::{iceoryx_send::IceoryxSend, testing::abandonable::Abandonable};
use iceoryx2_cal::{dynamic_storage::DynamicStorage, static_storage::StaticStorage};
#[derive(Debug)]
pub struct PortFactory<
Service: service::Service,
RequestPayload: Debug + IceoryxSend + ?Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + IceoryxSend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> {
pub(crate) service: SharedServiceState<Service, RequestResponseResources<Service>>,
_request_payload: PhantomData<RequestPayload>,
_request_header: PhantomData<RequestHeader>,
_response_payload: PhantomData<ResponsePayload>,
_response_header: PhantomData<ResponseHeader>,
}
unsafe impl<
Service: service::Service,
RequestPayload: Debug + IceoryxSend + ?Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + IceoryxSend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> Send for PortFactory<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
{
}
unsafe impl<
Service: service::Service,
RequestPayload: Debug + IceoryxSend + ?Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + IceoryxSend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> Sync for PortFactory<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
{
}
impl<
Service: service::Service,
RequestPayload: Debug + IceoryxSend + ?Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + IceoryxSend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> Abandonable
for PortFactory<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
{
unsafe fn abandon_in_place(mut this: NonNull<Self>) {
let this = unsafe { this.as_mut() };
unsafe { SharedServiceState::abandon_in_place(NonNull::from_mut(&mut this.service)) };
}
}
impl<
Service: service::Service,
RequestPayload: Debug + IceoryxSend + ?Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + IceoryxSend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> Clone for PortFactory<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
{
fn clone(&self) -> Self {
Self {
service: self.service.clone(),
_request_payload: PhantomData,
_request_header: PhantomData,
_response_payload: PhantomData,
_response_header: PhantomData,
}
}
}
impl<
Service: service::Service,
RequestPayload: Debug + IceoryxSend + ?Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + IceoryxSend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> crate::service::port_factory::PortFactory
for PortFactory<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
{
type Service = Service;
type StaticConfig = static_config::request_response::StaticConfig;
type DynamicConfig = dynamic_config::request_response::DynamicConfig<Service::Bag>;
fn name(&self) -> &ServiceName {
self.service.static_config().name()
}
fn unique_service_id(&self) -> UniqueServiceId {
self.service.static_config().unique_service_id()
}
fn service_hash(&self) -> &ServiceHash {
self.service.static_config().service_hash()
}
fn attributes(&self) -> &AttributeSet {
self.service.static_config().attributes()
}
fn static_config(&self) -> &Self::StaticConfig {
self.service.static_config().request_response()
}
fn dynamic_config(&self) -> &Self::DynamicConfig {
self.service.dynamic_storage().get().request_response()
}
fn nodes<F: FnMut(crate::node::NodeState<Service>) -> CallbackProgression>(
&self,
callback: F,
) -> Result<(), NodeListFailure> {
nodes(
self.service.dynamic_storage().get(),
self.service.shared_node().config(),
callback,
)
}
}
impl<
Service: service::Service,
RequestPayload: Debug + IceoryxSend + ?Sized,
RequestHeader: Debug + ZeroCopySend,
ResponsePayload: Debug + IceoryxSend + ?Sized,
ResponseHeader: Debug + ZeroCopySend,
> PortFactory<Service, RequestPayload, RequestHeader, ResponsePayload, ResponseHeader>
{
pub(crate) fn new(service: ServiceState<Service, RequestResponseResources<Service>>) -> Self {
Self {
service: SharedServiceState {
state: Arc::new(service),
},
_request_payload: PhantomData,
_request_header: PhantomData,
_response_payload: PhantomData,
_response_header: PhantomData,
}
}
pub fn client_builder(
&self,
) -> PortFactoryClient<
'_,
Service,
RequestPayload,
RequestHeader,
ResponsePayload,
ResponseHeader,
> {
PortFactoryClient::new(self)
}
pub fn server_builder(
&self,
) -> PortFactoryServer<
'_,
Service,
RequestPayload,
RequestHeader,
ResponsePayload,
ResponseHeader,
> {
PortFactoryServer::new(self)
}
pub fn request_type_definition(
&self,
) -> Option<&<Service::StaticStorage as StaticStorage>::View> {
self.service
.additional_resource()
.request_type_definition()
.map(|v| v.view())
}
pub fn response_type_definition(
&self,
) -> Option<&<Service::StaticStorage as StaticStorage>::View> {
self.service
.additional_resource()
.response_type_definition()
.map(|v| v.view())
}
}