use byteorder::WriteBytesExt;
use crate::codec::*;
use crate::IoResult;
#[derive(Debug, Default, Clone)]
pub struct CreateTopicsResponse {
pub throttle_time_ms: i32,
pub topics: Vec<CreatableTopicResult>,
pub unknown_tagged_fields: Vec<RawTaggedField>,
}
impl Encodable for CreateTopicsResponse {
fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
if version >= 2 {
Int32.encode(buf, self.throttle_time_ms)?;
}
NullableArray(Struct(version), version >= 5).encode(buf, self.topics.as_slice())?;
if version >= 5 {
RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
}
Ok(())
}
fn calculate_size(&self, version: i16) -> usize {
let mut res = 0;
if version >= 2 {
res += Int32::SIZE; }
res += NullableArray(Struct(version), version >= 5).calculate_size(self.topics.as_slice());
if version >= 5 {
res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
}
res
}
}
#[derive(Debug, Default, Clone)]
pub struct CreatableTopicResult {
pub name: String,
pub topic_id: uuid::Uuid,
pub error_code: i16,
pub error_message: Option<String>,
pub topic_config_error_code: i16,
pub num_partitions: i32,
pub replication_factor: i16,
pub configs: Vec<CreatableTopicConfigs>,
pub unknown_tagged_fields: Vec<RawTaggedField>,
}
impl Encodable for CreatableTopicResult {
fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
NullableString(version >= 5).encode(buf, self.name.as_str())?;
if version >= 7 {
Uuid.encode(buf, self.topic_id)?;
}
Int16.encode(buf, self.error_code)?;
if version >= 1 {
NullableString(version >= 5).encode(buf, self.error_message.as_deref())?;
}
if version >= 5 {
Int32.encode(buf, self.num_partitions)?;
Int16.encode(buf, self.replication_factor)?;
NullableArray(Struct(version), true).encode(buf, self.configs.as_slice())?;
}
if version >= 5 {
RawTaggedFieldList.encode_with(buf, 1, &self.unknown_tagged_fields, |buf| {
RawTaggedFieldWriter.write_field(buf, 0, Int16, self.topic_config_error_code)?;
Ok(())
})?;
}
Ok(())
}
fn calculate_size(&self, version: i16) -> usize {
let mut res = 0;
res += NullableString(version >= 5).calculate_size(self.name.as_str());
if version >= 7 {
res += Uuid::SIZE; }
res += Int16::SIZE; if version >= 1 {
res += NullableString(version >= 5).calculate_size(self.error_message.as_deref());
}
if version >= 5 {
res += Int32::SIZE; res += Int16::SIZE; res += NullableArray(Struct(version), true).calculate_size(self.configs.as_slice());
}
if version >= 5 {
res += RawTaggedFieldList.calculate_size_with(
1,
RawTaggedFieldWriter.calculate_field_size(0, Int16, &self.topic_config_error_code),
&self.unknown_tagged_fields,
);
}
res
}
}
#[derive(Debug, Default, Clone)]
pub struct CreatableTopicConfigs {
pub name: String,
pub value: Option<String>,
pub read_only: bool,
pub config_source: i8,
pub is_sensitive: bool,
pub unknown_tagged_fields: Vec<RawTaggedField>,
}
impl Encodable for CreatableTopicConfigs {
fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
if version < 5 {
Err(err_encode_message_unsupported(
version,
"CreatableTopicConfigs",
))?
}
NullableString(true).encode(buf, self.name.as_str())?;
NullableString(true).encode(buf, self.value.as_deref())?;
Bool.encode(buf, self.read_only)?;
Int8.encode(buf, self.config_source)?;
Bool.encode(buf, self.is_sensitive)?;
RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
Ok(())
}
fn calculate_size(&self, _version: i16) -> usize {
let mut res = 0;
res += NullableString(true).calculate_size(self.name.as_str());
res += NullableString(true).calculate_size(self.value.as_deref());
res += Bool::SIZE; res += Int8::SIZE; res += Bool::SIZE; res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
res
}
}