use std::collections::HashMap;
use crate::pubsub::api;
use crate::pubsub::{Client, Error};
#[derive(Clone)]
pub struct Message {
pub(crate) client: Client,
pub(crate) data: Vec<u8>,
pub(crate) attributes: HashMap<String, String>,
pub(crate) ack_id: String,
pub(crate) message_id: String,
pub(crate) publish_time: chrono::NaiveDateTime,
pub(crate) subscription_name: String,
}
impl Message {
pub fn id(&self) -> &str {
self.message_id.as_str()
}
pub fn data(&self) -> &[u8] {
self.data.as_slice()
}
pub fn attributes(&self) -> &HashMap<String, String> {
&self.attributes
}
pub fn publish_time(&self) -> chrono::NaiveDateTime {
self.publish_time
}
pub async fn ack(&mut self) -> Result<(), Error> {
let request = api::AcknowledgeRequest {
subscription: self.subscription_name.clone(),
ack_ids: vec![self.ack_id.clone()],
};
let request = self.client.construct_request(request).await?;
self.client.subscriber.acknowledge(request).await?;
Ok(())
}
pub async fn nack(&mut self) -> Result<(), Error> {
let request = api::ModifyAckDeadlineRequest {
subscription: self.subscription_name.clone(),
ack_ids: vec![self.ack_id.clone()],
ack_deadline_seconds: 0,
};
let request = self.client.construct_request(request).await?;
self.client.subscriber.modify_ack_deadline(request).await?;
Ok(())
}
}