use byteorder::WriteBytesExt;
use crate::codec::*;
use crate::IoResult;
#[derive(Debug, Default, Clone)]
pub struct ApiVersionsResponse {
pub error_code: i16,
pub api_keys: Vec<ApiVersion>,
pub throttle_time_ms: i32,
pub supported_features: Vec<SupportedFeatureKey>,
pub finalized_features_epoch: i64,
pub finalized_features: Vec<FinalizedFeatureKey>,
pub zk_migration_ready: bool,
pub unknown_tagged_fields: Vec<RawTaggedField>,
}
impl Encodable for ApiVersionsResponse {
fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
Int16.encode(buf, self.error_code)?;
NullableArray(Struct(version), version >= 3).encode(buf, self.api_keys.as_slice())?;
if version >= 1 {
Int32.encode(buf, self.throttle_time_ms)?;
}
if version >= 3 {
RawTaggedFieldList.encode_with(buf, 3, &self.unknown_tagged_fields, |buf| {
RawTaggedFieldWriter.write_field(
buf,
0,
NullableArray(Struct(version), version >= 3),
self.supported_features.as_slice(),
)?;
RawTaggedFieldWriter.write_field(buf, 1, Int64, self.finalized_features_epoch)?;
RawTaggedFieldWriter.write_field(
buf,
2,
NullableArray(Struct(version), version >= 3),
self.finalized_features.as_slice(),
)?;
Ok(())
})?;
}
Ok(())
}
fn calculate_size(&self, version: i16) -> usize {
let mut res = 0;
res += Int16::SIZE; res +=
NullableArray(Struct(version), version >= 3).calculate_size(self.api_keys.as_slice());
if version >= 1 {
res += Int32::SIZE; }
if version >= 3 {
res += RawTaggedFieldList.calculate_size_with(
3,
RawTaggedFieldWriter.calculate_field_size(
0,
NullableArray(Struct(version), version >= 3),
self.supported_features.as_slice(),
) + RawTaggedFieldWriter.calculate_field_size(
1,
Int64,
&self.finalized_features_epoch,
) + RawTaggedFieldWriter.calculate_field_size(
2,
NullableArray(Struct(version), version >= 3),
self.finalized_features.as_slice(),
),
&self.unknown_tagged_fields,
);
}
res
}
}
#[derive(Debug, Default, Clone)]
pub struct ApiVersion {
pub api_key: i16,
pub min_version: i16,
pub max_version: i16,
pub unknown_tagged_fields: Vec<RawTaggedField>,
}
impl Encodable for ApiVersion {
fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
Int16.encode(buf, self.api_key)?;
Int16.encode(buf, self.min_version)?;
Int16.encode(buf, self.max_version)?;
if version >= 3 {
RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
}
Ok(())
}
fn calculate_size(&self, version: i16) -> usize {
let mut res = 0;
res += Int16::SIZE; res += Int16::SIZE; res += Int16::SIZE; if version >= 3 {
res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
}
res
}
}
#[derive(Debug, Default, Clone)]
pub struct SupportedFeatureKey {
pub name: String,
pub min_version: i16,
pub max_version: i16,
pub unknown_tagged_fields: Vec<RawTaggedField>,
}
impl Encodable for SupportedFeatureKey {
fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
if version > 3 {
Err(err_encode_message_unsupported(
version,
"SupportedFeatureKey",
))?
}
NullableString(true).encode(buf, self.name.as_ref())?;
Int16.encode(buf, self.min_version)?;
Int16.encode(buf, self.max_version)?;
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_ref());
res += Int16::SIZE; res += Int16::SIZE; res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
res
}
}
#[derive(Debug, Default, Clone)]
pub struct FinalizedFeatureKey {
pub name: String,
pub max_version_level: i16,
pub min_version_level: i16,
pub unknown_tagged_fields: Vec<RawTaggedField>,
}
impl Encodable for FinalizedFeatureKey {
fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
if version > 3 {
Err(err_encode_message_unsupported(
version,
"FinalizedFeatureKey",
))?
}
NullableString(true).encode(buf, self.name.as_ref())?;
Int16.encode(buf, self.max_version_level)?;
Int16.encode(buf, self.min_version_level)?;
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_ref());
res += Int16::SIZE; res += Int16::SIZE; res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
res
}
}