1use byteorder::WriteBytesExt;
16
17use crate::codec::*;
18use crate::IoResult;
19
20#[derive(Debug, Default, Clone)]
37pub struct OffsetFetchResponse {
38 pub throttle_time_ms: i32,
41 pub topics: Vec<OffsetFetchResponseTopic>,
43 pub error_code: i16,
45 pub groups: Vec<OffsetFetchResponseGroup>,
47 pub unknown_tagged_fields: Vec<RawTaggedField>,
49}
50
51impl Encodable for OffsetFetchResponse {
52 fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
53 if version >= 3 {
54 Int32.encode(buf, self.throttle_time_ms)?;
55 }
56 if version <= 7 {
57 NullableArray(Struct(version), version >= 6).encode(buf, self.topics.as_slice())?;
58 }
59 if (2..=7).contains(&version) {
60 Int16.encode(buf, self.error_code)?;
61 }
62 if version >= 8 {
63 NullableArray(Struct(version), true).encode(buf, self.groups.as_slice())?;
64 }
65 if version >= 6 {
66 RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
67 }
68 Ok(())
69 }
70
71 fn calculate_size(&self, version: i16) -> usize {
72 let mut res = 0;
73 if version >= 3 {
74 res += Int32::SIZE; }
76 if version <= 7 {
77 res +=
78 NullableArray(Struct(version), version >= 6).calculate_size(self.topics.as_slice());
79 }
80 if (2..=7).contains(&version) {
81 res += Int16::SIZE; }
83 if version >= 8 {
84 res += NullableArray(Struct(version), true).calculate_size(self.groups.as_slice());
85 }
86 if version >= 6 {
87 res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
88 }
89 res
90 }
91}
92
93#[derive(Debug, Default, Clone)]
94pub struct OffsetFetchResponseTopic {
95 pub name: String,
97 pub partitions: Vec<OffsetFetchResponsePartition>,
99 pub unknown_tagged_fields: Vec<RawTaggedField>,
101}
102
103impl Encodable for OffsetFetchResponseTopic {
104 fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
105 if version > 7 {
106 Err(err_encode_message_unsupported(
107 version,
108 "OffsetFetchResponseTopic",
109 ))?
110 }
111 NullableString(version >= 6).encode(buf, self.name.as_str())?;
112 NullableArray(Struct(version), version >= 6).encode(buf, self.partitions.as_slice())?;
113 if version >= 6 {
114 RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
115 }
116 Ok(())
117 }
118
119 fn calculate_size(&self, version: i16) -> usize {
120 let mut res = 0;
121 res += NullableString(version >= 6).calculate_size(self.name.as_str());
122 res +=
123 NullableArray(Struct(version), version >= 6).calculate_size(self.partitions.as_slice());
124 if version >= 6 {
125 res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
126 }
127 res
128 }
129}
130
131#[derive(Debug, Default, Clone)]
132pub struct OffsetFetchResponsePartition {
133 pub partition_index: i32,
135 pub committed_offset: i64,
137 pub committed_leader_epoch: i32,
139 pub metadata: Option<String>,
141 pub error_code: i16,
143 pub unknown_tagged_fields: Vec<RawTaggedField>,
145}
146
147impl Encodable for OffsetFetchResponsePartition {
148 fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
149 Int32.encode(buf, self.partition_index)?;
150 Int64.encode(buf, self.committed_offset)?;
151 if version >= 5 {
152 Int32.encode(buf, self.committed_leader_epoch)?;
153 }
154 NullableString(version >= 6).encode(buf, self.metadata.as_deref())?;
155 Int16.encode(buf, self.error_code)?;
156 if version >= 6 {
157 RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
158 }
159 Ok(())
160 }
161
162 fn calculate_size(&self, version: i16) -> usize {
163 let mut res = 0;
164 res += Int32::SIZE; res += Int64::SIZE; if version >= 5 {
167 res += Int32::SIZE; }
169 res += NullableString(version >= 6).calculate_size(self.metadata.as_deref());
170 res += Int16::SIZE; if version >= 6 {
172 res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
173 }
174 res
175 }
176}
177
178#[derive(Debug, Default, Clone)]
179pub struct OffsetFetchResponseGroup {
180 pub group_id: String,
182 pub topics: Vec<OffsetFetchResponseTopics>,
184 pub error_code: i16,
186 pub unknown_tagged_fields: Vec<RawTaggedField>,
188}
189
190impl Encodable for OffsetFetchResponseGroup {
191 fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
192 if version < 8 {
193 Err(err_encode_message_unsupported(
194 version,
195 "OffsetFetchResponseGroup",
196 ))?
197 }
198 NullableString(true).encode(buf, self.group_id.as_str())?;
199 NullableArray(Struct(version), true).encode(buf, self.topics.as_slice())?;
200 Int16.encode(buf, self.error_code)?;
201 RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
202 Ok(())
203 }
204
205 fn calculate_size(&self, version: i16) -> usize {
206 let mut res = 0;
207 res += NullableString(true).calculate_size(self.group_id.as_str());
208 res += NullableArray(Struct(version), true).calculate_size(self.topics.as_slice());
209 res += Int16::SIZE; res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
211 res
212 }
213}
214
215#[derive(Debug, Default, Clone)]
216pub struct OffsetFetchResponseTopics {
217 pub name: String,
219 pub partitions: Vec<OffsetFetchResponsePartitions>,
221 pub unknown_tagged_fields: Vec<RawTaggedField>,
223}
224
225impl Encodable for OffsetFetchResponseTopics {
226 fn write<B: WriteBytesExt>(&self, buf: &mut B, version: i16) -> IoResult<()> {
227 NullableString(true).encode(buf, self.name.as_str())?;
228 NullableArray(Struct(version), true).encode(buf, self.partitions.as_slice())?;
229 RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
230 Ok(())
231 }
232
233 fn calculate_size(&self, version: i16) -> usize {
234 let mut res = 0;
235 res += NullableString(true).calculate_size(self.name.as_str());
236 res += NullableArray(Struct(version), true).calculate_size(self.partitions.as_slice());
237 res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
238 res
239 }
240}
241
242#[derive(Debug, Default, Clone)]
243pub struct OffsetFetchResponsePartitions {
244 pub partition_index: i32,
246 pub committed_offset: i64,
248 pub committed_leader_epoch: i32,
250 pub metadata: Option<String>,
252 pub error_code: i16,
254 pub unknown_tagged_fields: Vec<RawTaggedField>,
256}
257
258impl Encodable for OffsetFetchResponsePartitions {
259 fn write<B: WriteBytesExt>(&self, buf: &mut B, _version: i16) -> IoResult<()> {
260 Int32.encode(buf, self.partition_index)?;
261 Int64.encode(buf, self.committed_offset)?;
262 Int32.encode(buf, self.committed_leader_epoch)?;
263 NullableString(true).encode(buf, self.metadata.as_deref())?;
264 Int16.encode(buf, self.error_code)?;
265 RawTaggedFieldList.encode(buf, &self.unknown_tagged_fields)?;
266 Ok(())
267 }
268
269 fn calculate_size(&self, _version: i16) -> usize {
270 let mut res = 0;
271 res += Int32::SIZE; res += Int64::SIZE; res += Int32::SIZE; res += NullableString(true).calculate_size(self.metadata.as_deref());
275 res += Int16::SIZE; res += RawTaggedFieldList.calculate_size(&self.unknown_tagged_fields);
277 res
278 }
279}