use ruststream::{BuildContext, Field};
use crate::message::LapinMessage;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct AmqpContext {
exchange: String,
routing_key: String,
redelivered: bool,
delivery_tag: u64,
}
impl AmqpContext {
#[must_use]
pub fn exchange(&self) -> &str {
&self.exchange
}
#[must_use]
pub fn routing_key(&self) -> &str {
&self.routing_key
}
#[must_use]
pub fn redelivered(&self) -> bool {
self.redelivered
}
#[must_use]
pub fn delivery_tag(&self) -> u64 {
self.delivery_tag
}
}
impl BuildContext<LapinMessage> for AmqpContext {
fn build(msg: &LapinMessage) -> Self {
Self {
exchange: msg.exchange().to_owned(),
routing_key: msg.routing_key().to_owned(),
redelivered: msg.redelivered(),
delivery_tag: msg.delivery_tag(),
}
}
}
pub mod keys {
use ruststream::ContextField;
use super::{AmqpContext, Field};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct Exchange;
impl Field<AmqpContext> for Exchange {
type Value<'a> = &'a str;
fn get(self, src: &AmqpContext) -> &str {
src.exchange()
}
}
impl ContextField for Exchange {
type Context = AmqpContext;
type Value = String;
fn read(self, src: &AmqpContext) -> String {
src.exchange().to_owned()
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct RoutingKey;
impl Field<AmqpContext> for RoutingKey {
type Value<'a> = &'a str;
fn get(self, src: &AmqpContext) -> &str {
src.routing_key()
}
}
impl ContextField for RoutingKey {
type Context = AmqpContext;
type Value = String;
fn read(self, src: &AmqpContext) -> String {
src.routing_key().to_owned()
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct Redelivered;
impl Field<AmqpContext> for Redelivered {
type Value<'a> = bool;
fn get(self, src: &AmqpContext) -> bool {
src.redelivered()
}
}
impl ContextField for Redelivered {
type Context = AmqpContext;
type Value = bool;
fn read(self, src: &AmqpContext) -> bool {
src.redelivered()
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct DeliveryTag;
impl Field<AmqpContext> for DeliveryTag {
type Value<'a> = u64;
fn get(self, src: &AmqpContext) -> u64 {
src.delivery_tag()
}
}
impl ContextField for DeliveryTag {
type Context = AmqpContext;
type Value = u64;
fn read(self, src: &AmqpContext) -> u64 {
src.delivery_tag()
}
}
}