use crate::{
payload_writer::PayloadWriter,
publisher::{Publisher, Timestamp},
types::TopicId,
};
use rustecal_core::types::DataTypeInfo;
use std::{marker::PhantomData, sync::Arc};
pub trait PublisherMessage {
fn datatype() -> DataTypeInfo;
fn to_bytes(&self) -> Arc<[u8]>;
}
pub struct TypedPublisher<T: PublisherMessage> {
publisher: Publisher,
_phantom: PhantomData<T>,
}
impl<T: PublisherMessage> TypedPublisher<T> {
pub fn new(topic_name: &str) -> Result<Self, String> {
let datatype = T::datatype();
let publisher = Publisher::new(topic_name, datatype)?;
Ok(Self {
publisher,
_phantom: PhantomData,
})
}
pub fn send(&self, message: &T, timestamp: Timestamp) -> bool {
let bytes = message.to_bytes();
self.publisher.send(&bytes, timestamp)
}
pub fn send_payload_writer<W: PayloadWriter + 'static>(
&self,
writer: &mut W,
timestamp: Timestamp,
) -> bool {
self.publisher.send_payload_writer(writer, timestamp)
}
pub fn get_subscriber_count(&self) -> usize {
self.publisher.get_subscriber_count()
}
pub fn get_topic_name(&self) -> Option<String> {
self.publisher.get_topic_name()
}
pub fn get_topic_id(&self) -> Option<TopicId> {
self.publisher.get_topic_id()
}
pub fn get_data_type_information(&self) -> Option<DataTypeInfo> {
self.publisher.get_data_type_information()
}
}