mirror of
https://github.com/Noratrieb/haesli.git
synced 2026-01-14 11:45:02 +01:00
42 lines
1.1 KiB
Rust
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(())
|
|
}
|