use crate::AppConfig;
use strut_rabbitmq::{
Decoder, Handle, NoopDecoder, Publisher, RabbitMqConfig, StringDecoder, StringSubscriber,
Subscriber, UndecodedSubscriber,
};
pub struct RabbitMq;
impl RabbitMq {
pub fn publisher(name: impl AsRef<str>) -> Publisher {
let (config, handle) = Self::config_and_handle();
let egress = config.egress().expect(name);
let publisher = Publisher::start(handle, egress.clone());
publisher
}
pub fn subscriber_with_decoder<T, D>(name: impl AsRef<str>, decoder: D) -> Subscriber<T, D>
where
D: Decoder<Result = T>,
{
Self::make_subscriber(name, decoder)
}
pub fn undecoded_subscriber(name: impl AsRef<str>) -> UndecodedSubscriber {
Self::subscriber_with_decoder(name, NoopDecoder)
}
pub fn string_subscriber(name: impl AsRef<str>) -> StringSubscriber {
Self::subscriber_with_decoder(name, StringDecoder)
}
#[cfg(feature = "rabbitmq-json")]
pub fn json_subscriber<T>(name: impl AsRef<str>) -> strut_rabbitmq::JsonSubscriber<T>
where
T: serde::de::DeserializeOwned,
{
Self::subscriber_with_decoder(name, strut_rabbitmq::JsonDecoder::default())
}
fn make_subscriber<T, D>(name: impl AsRef<str>, decoder: D) -> Subscriber<T, D>
where
D: Decoder<Result = T>,
{
let (config, handle) = Self::config_and_handle();
let ingress = config.ingress().expect(name);
let subscriber = Subscriber::start(handle, ingress.clone(), decoder);
subscriber
}
fn config_and_handle() -> (&'static RabbitMqConfig, &'static Handle) {
let config = AppConfig::get().rabbitmq();
let handle = config.default_handle();
(config, handle)
}
}