use bytes::BufMut;
use crate::{
encode::{AsStrings, ToByte},
error::Result,
protocol::HeaderRequest,
};
const API_KEY_METADATA: i16 = 3;
const API_VERSION: i16 = 1;
#[derive(Debug)]
pub struct MetadataRequest<'a, T> {
pub header: HeaderRequest<'a>,
pub topics: Option<&'a [T]>,
}
impl<'a, T: AsRef<str>> MetadataRequest<'a, T> {
pub fn new(correlation_id: i32, client_id: &'a str, topics: &'a [T]) -> MetadataRequest<'a, T> {
let topics = if topics.is_empty() {
None
} else {
Some(topics)
};
MetadataRequest {
header: HeaderRequest::new(API_KEY_METADATA, API_VERSION, correlation_id, client_id),
topics,
}
}
}
impl<'a, T: AsRef<str> + 'a> ToByte for MetadataRequest<'a, T> {
fn encode<W: BufMut>(&self, buffer: &mut W) -> Result<()> {
self.header.encode(buffer)?;
match self.topics {
Some(topics) => AsStrings(topics).encode(buffer)?,
None => {
buffer.put_i32(-1);
}
}
Ok(())
}
}