use cheetah_string::CheetahString;
use rocketmq_macros::RequestHeaderCodec;
use serde::Deserialize;
use serde::Serialize;
use crate::rpc::topic_request_header::TopicRequestHeader;
#[derive(Clone, Debug, Serialize, Deserialize, Default, RequestHeaderCodec)]
#[header(
type_id = "rocketmq_protocol::protocol::header::get_consumer_status_request_header::GetConsumerStatusRequestHeader",
java_class = "org.apache.rocketmq.remoting.protocol.header.GetConsumerStatusRequestHeader",
lookup = "scan",
fast
)]
#[serde(rename_all = "camelCase")]
pub struct GetConsumerStatusRequestHeader {
#[header(required)]
pub topic: CheetahString,
#[header(required)]
pub group: CheetahString,
pub client_addr: Option<CheetahString>,
#[serde(flatten)]
#[header(flatten, presence = "always")]
pub topic_request_header: Option<TopicRequestHeader>,
}
impl GetConsumerStatusRequestHeader {
pub fn new(topic: CheetahString, group: CheetahString) -> Self {
Self {
topic,
group,
client_addr: None,
topic_request_header: None,
}
}
}
#[cfg(test)]
mod tests {
use std::collections::HashMap;
use super::*;
use crate::protocol::command_custom_header::FromMap;
#[test]
fn get_consumer_status_request_header_serialization() {
let mut header =
GetConsumerStatusRequestHeader::new(CheetahString::from("topic1"), CheetahString::from("group1"));
assert_eq!(header.topic, "topic1");
assert_eq!(header.group, "group1");
assert!(header.client_addr.is_none());
assert!(header.topic_request_header.is_none());
header.client_addr = Some(CheetahString::from("127.0.0.1"));
header.topic_request_header = Some(TopicRequestHeader {
lo: Some(true),
rpc_request_header: Some(crate::rpc::rpc_request_header::RpcRequestHeader {
broker_name: Some(CheetahString::from("broker")),
..Default::default()
}),
});
let json = serde_json::to_string(&header).unwrap();
assert!(json.contains("\"topic\":\"topic1\""));
assert!(json.contains("\"group\":\"group1\""));
assert!(json.contains("\"clientAddr\":\"127.0.0.1\""));
assert!(json.contains("\"bname\":\"broker\""));
assert!(json.contains("\"lo\":true"));
}
#[test]
fn get_consumer_status_request_header_deserialization() {
let json = r#"{"topic":"topic1","group":"group1","clientAddr":"127.0.0.1","lo":true,"bname":"broker"}"#;
let header: GetConsumerStatusRequestHeader = serde_json::from_str(json).unwrap();
assert_eq!(header.topic, "topic1");
assert_eq!(header.group, "group1");
assert_eq!(header.client_addr, Some(CheetahString::from("127.0.0.1")));
assert_eq!(
header
.topic_request_header
.unwrap()
.rpc_request_header
.unwrap()
.broker_name,
Some(CheetahString::from("broker"))
);
}
#[test]
fn get_consumer_status_request_header_from_map() {
let mut map = HashMap::new();
map.insert(CheetahString::from("topic"), CheetahString::from("topic1"));
map.insert(CheetahString::from("group"), CheetahString::from("group1"));
map.insert(CheetahString::from("clientAddr"), CheetahString::from("127.0.0.1"));
map.insert(CheetahString::from("lo"), CheetahString::from("true"));
map.insert(CheetahString::from("bname"), CheetahString::from("broker1"));
let header = <GetConsumerStatusRequestHeader as FromMap>::from(&map).unwrap();
assert_eq!(header.topic, "topic1");
assert_eq!(header.group, "group1");
assert_eq!(header.client_addr, Some(CheetahString::from("127.0.0.1")));
assert_eq!(
header
.topic_request_header
.unwrap()
.rpc_request_header
.unwrap()
.broker_name,
Some(CheetahString::from("broker1"))
);
}
}