use std::marker::PhantomData;
use crate::{
consumer::data::MessageData,
message::proto::{MessageIdData, MessageMetadata},
DeserializeMessage, Payload,
};
pub struct Message<T> {
pub topic: String,
pub payload: Payload,
pub message_id: MessageData,
pub(super) _phantom: PhantomData<T>,
}
impl<T> Message<T> {
#[cfg_attr(feature = "telemetry", tracing::instrument(skip_all))]
pub fn metadata(&self) -> &MessageMetadata {
&self.payload.metadata
}
#[cfg_attr(feature = "telemetry", tracing::instrument(skip_all))]
pub fn message_id(&self) -> &MessageIdData {
&self.message_id.id
}
#[cfg_attr(feature = "telemetry", tracing::instrument(skip_all))]
pub fn key(&self) -> Option<String> {
self.payload.metadata.partition_key.clone()
}
}
impl<T: DeserializeMessage> Message<T> {
#[cfg_attr(feature = "telemetry", tracing::instrument(skip_all))]
pub fn deserialize(&self) -> T::Output {
T::deserialize_message(&self.payload)
}
}