use std::collections::HashMap;
use crate::base::query_result::QueryResult;
use rocketmq_model::common::message::message_ext::MessageExt;
use rocketmq_model::common::message::message_queue::MessageQueue;
fn unsupported_mq_admin_operation(operation: &'static str) -> crate::ClientError {
crate::ClientError::illegal_argument(format!(
"{operation} is not supported by this MQConsumer implementation"
))
}
#[allow(async_fn_in_trait)]
pub trait MQConsumer {
async fn create_topic(
&mut self,
_key: &str,
_new_topic: &str,
_queue_num: i32,
_attributes: HashMap<String, String>,
) -> crate::ClientResult<()> {
Err(unsupported_mq_admin_operation("createTopic"))
}
async fn create_topic_with_flag(
&mut self,
_key: &str,
_new_topic: &str,
_queue_num: i32,
_topic_sys_flag: i32,
_attributes: HashMap<String, String>,
) -> crate::ClientResult<()> {
Err(unsupported_mq_admin_operation("createTopicWithFlag"))
}
async fn search_offset(&mut self, _mq: &MessageQueue, _timestamp: u64) -> crate::ClientResult<i64> {
Err(unsupported_mq_admin_operation("searchOffset"))
}
async fn max_offset(&mut self, _mq: &MessageQueue) -> crate::ClientResult<i64> {
Err(unsupported_mq_admin_operation("maxOffset"))
}
async fn min_offset(&mut self, _mq: &MessageQueue) -> crate::ClientResult<i64> {
Err(unsupported_mq_admin_operation("minOffset"))
}
async fn earliest_msg_store_time(&mut self, _mq: &MessageQueue) -> crate::ClientResult<i64> {
Err(unsupported_mq_admin_operation("earliestMsgStoreTime"))
}
async fn query_message(
&mut self,
_topic: &str,
_key: &str,
_max_num: i32,
_begin: u64,
_end: u64,
) -> crate::ClientResult<QueryResult> {
Err(unsupported_mq_admin_operation("queryMessage"))
}
async fn view_message(&mut self, _topic: &str, _msg_id: &str) -> crate::ClientResult<MessageExt> {
Err(unsupported_mq_admin_operation("viewMessage"))
}
async fn send_message_back(
&mut self,
msg: MessageExt,
delay_level: i32,
broker_name: &str,
) -> crate::ClientResult<()>;
async fn send_message_back_to_origin_broker(
&mut self,
msg: MessageExt,
delay_level: i32,
) -> crate::ClientResult<()> {
let broker_name = msg.broker_name().to_string();
self.send_message_back(msg, delay_level, &broker_name).await
}
async fn fetch_subscribe_message_queues(&mut self, topic: &str) -> crate::ClientResult<Vec<MessageQueue>>;
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_support::error_assertions::assert_invalid_argument;
struct CustomConsumer;
impl MQConsumer for CustomConsumer {
async fn send_message_back(
&mut self,
_msg: MessageExt,
_delay_level: i32,
_broker_name: &str,
) -> crate::ClientResult<()> {
Ok(())
}
async fn fetch_subscribe_message_queues(&mut self, _topic: &str) -> crate::ClientResult<Vec<MessageQueue>> {
Ok(Vec::new())
}
}
#[tokio::test]
async fn admin_defaults_return_typed_unsupported_error_without_breaking_custom_consumers() {
let mut consumer = CustomConsumer;
let mq = MessageQueue::from_parts("topic", "broker-a", 0);
let error = consumer
.max_offset(&mq)
.await
.expect_err("default MQAdmin facade should be unsupported");
assert_invalid_argument(&error);
}
}