haesli/haesli_messaging/src/methods/publish.rs
2022-03-26 13:02:39 +01:00

42 lines
1.1 KiB
Rust

use std::sync::Arc;
use haesli_core::{
connection::Channel,
error::{ChannelException, ConException},
message::Message,
queue::QueueEvent,
};
use tracing::{debug, error};
use crate::{routing, Result};
pub fn publish(channel_handle: Channel, message: Message) -> Result<()> {
debug!(?message, "Publishing message");
let global_data = channel_handle.global_data.clone();
let routing = &message.routing;
let global_data = global_data.lock();
let exchange = &routing.exchange;
let exchange = global_data
.exchanges
.get(exchange.as_str())
.ok_or(ChannelException::NotFound)?;
let queues =
routing::route_message(exchange, &routing.routing_key).ok_or(ChannelException::NotFound)?; // todo this isn't really correct but the tests pass ✔️
for queue in queues {
queue
.event_send
.try_send(QueueEvent::PublishMessage(Arc::clone(&message)))
.map_err(|err| {
error!(?err, "Failed to send message to queue event queue");
ConException::InternalError
})?;
}
Ok(())
}