1use std::io::{Read, Result, Write};
4
5use serde::{Deserialize, Serialize};
6#[cfg(test)] use proptest_derive::Arbitrary;
7
8use crate::arrays::{read_array, write_array};
9use crate::bytes::{read_bytes, write_bytes};
10use crate::markers::{ApiMessage, Response};
11use crate::readable_writable::{Readable, Writable};
12#[cfg(test)] use crate::test_utils::{proptest_strategies, serde_bytes};
13
14#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
16#[cfg_attr(test, derive(Arbitrary))]
17pub struct DescribeGroupsResponse {
18 pub throttle_time_ms: i32,
20 #[cfg_attr(test, proptest(strategy = "proptest_strategies::vec()"))]
22 pub groups: Vec<DescribedGroup>,
23}
24
25impl ApiMessage for DescribeGroupsResponse {
26 fn api_key(&self) -> i16 {
27 15
28 }
29
30 fn version(&self) -> i16 {
31 1
32 }
33}
34
35impl Response for DescribeGroupsResponse { }
36
37impl Default for DescribeGroupsResponse {
38 fn default() -> Self {
39 DescribeGroupsResponse {
40 throttle_time_ms: 0_i32,
41 groups: Vec::<DescribedGroup>::new(),
42 }
43 }
44}
45
46impl DescribeGroupsResponse {
47 pub fn new(throttle_time_ms: i32, groups: Vec<DescribedGroup>) -> Self {
48 Self {
49 throttle_time_ms,
50 groups,
51 }
52 }
53}
54
55#[cfg(test)]
56mod tests_describe_groups_response_new_and_default {
57 use super::*;
58
59 #[test]
60 fn test() {
61 let d = DescribeGroupsResponse::new(
62 0_i32,
63 Vec::<DescribedGroup>::new(),
64 );
65 assert_eq!(d, DescribeGroupsResponse::default());
66 }
67}
68
69impl Readable for DescribeGroupsResponse {
70 fn read(#[allow(unused)] input: &mut impl Read) -> Result<Self> {
71 let throttle_time_ms = i32::read(input)?;
72 let groups = read_array::<DescribedGroup>(input, "groups", false)?;
73 Ok(DescribeGroupsResponse {
74 throttle_time_ms, groups
75 })
76 }
77}
78
79impl Writable for DescribeGroupsResponse {
80 fn write(&self, #[allow(unused)] output: &mut impl Write) -> Result<()> {
81 self.throttle_time_ms.write(output)?;
82 write_array(output, "self.groups", &self.groups, false)?;
83 Ok(())
84 }
85}
86
87#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
89#[cfg_attr(test, derive(Arbitrary))]
90pub struct DescribedGroup {
91 pub error_code: i16,
93 #[cfg_attr(test, proptest(strategy = "proptest_strategies::string()"))]
95 pub group_id: String,
96 #[cfg_attr(test, proptest(strategy = "proptest_strategies::string()"))]
98 pub group_state: String,
99 #[cfg_attr(test, proptest(strategy = "proptest_strategies::string()"))]
101 pub protocol_type: String,
102 #[cfg_attr(test, proptest(strategy = "proptest_strategies::string()"))]
104 pub protocol_data: String,
105 #[cfg_attr(test, proptest(strategy = "proptest_strategies::vec()"))]
107 pub members: Vec<DescribedGroupMember>,
108}
109
110impl Default for DescribedGroup {
111 fn default() -> Self {
112 DescribedGroup {
113 error_code: 0_i16,
114 group_id: String::from(""),
115 group_state: String::from(""),
116 protocol_type: String::from(""),
117 protocol_data: String::from(""),
118 members: Vec::<DescribedGroupMember>::new(),
119 }
120 }
121}
122
123impl DescribedGroup {
124 pub fn new<S1: AsRef<str>, S2: AsRef<str>, S3: AsRef<str>, S4: AsRef<str>>(error_code: i16, group_id: S1, group_state: S2, protocol_type: S3, protocol_data: S4, members: Vec<DescribedGroupMember>) -> Self {
125 Self {
126 error_code,
127 group_id: group_id.as_ref().to_string(),
128 group_state: group_state.as_ref().to_string(),
129 protocol_type: protocol_type.as_ref().to_string(),
130 protocol_data: protocol_data.as_ref().to_string(),
131 members,
132 }
133 }
134}
135
136#[cfg(test)]
137mod tests_described_group_new_and_default {
138 use super::*;
139
140 #[test]
141 fn test() {
142 let d = DescribedGroup::new(
143 0_i16,
144 String::from(""),
145 String::from(""),
146 String::from(""),
147 String::from(""),
148 Vec::<DescribedGroupMember>::new(),
149 );
150 assert_eq!(d, DescribedGroup::default());
151 }
152}
153
154impl Readable for DescribedGroup {
155 fn read(#[allow(unused)] input: &mut impl Read) -> Result<Self> {
156 let error_code = i16::read(input)?;
157 let group_id = String::read_ext(input, "group_id", false)?;
158 let group_state = String::read_ext(input, "group_state", false)?;
159 let protocol_type = String::read_ext(input, "protocol_type", false)?;
160 let protocol_data = String::read_ext(input, "protocol_data", false)?;
161 let members = read_array::<DescribedGroupMember>(input, "members", false)?;
162 Ok(DescribedGroup {
163 error_code, group_id, group_state, protocol_type, protocol_data, members
164 })
165 }
166}
167
168impl Writable for DescribedGroup {
169 fn write(&self, #[allow(unused)] output: &mut impl Write) -> Result<()> {
170 self.error_code.write(output)?;
171 self.group_id.write_ext(output, "self.group_id", false)?;
172 self.group_state.write_ext(output, "self.group_state", false)?;
173 self.protocol_type.write_ext(output, "self.protocol_type", false)?;
174 self.protocol_data.write_ext(output, "self.protocol_data", false)?;
175 write_array(output, "self.members", &self.members, false)?;
176 Ok(())
177 }
178}
179
180#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
182#[cfg_attr(test, derive(Arbitrary))]
183pub struct DescribedGroupMember {
184 #[cfg_attr(test, proptest(strategy = "proptest_strategies::string()"))]
186 pub member_id: String,
187 #[cfg_attr(test, proptest(strategy = "proptest_strategies::string()"))]
189 pub client_id: String,
190 #[cfg_attr(test, proptest(strategy = "proptest_strategies::string()"))]
192 pub client_host: String,
193 #[cfg_attr(test, proptest(strategy = "proptest_strategies::bytes()"))]
195 #[cfg_attr(test, serde(with="serde_bytes"))]
196 pub member_metadata: Vec<u8>,
197 #[cfg_attr(test, proptest(strategy = "proptest_strategies::bytes()"))]
199 #[cfg_attr(test, serde(with="serde_bytes"))]
200 pub member_assignment: Vec<u8>,
201}
202
203impl Default for DescribedGroupMember {
204 fn default() -> Self {
205 DescribedGroupMember {
206 member_id: String::from(""),
207 client_id: String::from(""),
208 client_host: String::from(""),
209 member_metadata: Vec::new(),
210 member_assignment: Vec::new(),
211 }
212 }
213}
214
215impl DescribedGroupMember {
216 pub fn new<S1: AsRef<str>, S2: AsRef<str>, S3: AsRef<str>>(member_id: S1, client_id: S2, client_host: S3, member_metadata: Vec<u8>, member_assignment: Vec<u8>) -> Self {
217 Self {
218 member_id: member_id.as_ref().to_string(),
219 client_id: client_id.as_ref().to_string(),
220 client_host: client_host.as_ref().to_string(),
221 member_metadata,
222 member_assignment,
223 }
224 }
225}
226
227#[cfg(test)]
228mod tests_described_group_member_new_and_default {
229 use super::*;
230
231 #[test]
232 fn test() {
233 let d = DescribedGroupMember::new(
234 String::from(""),
235 String::from(""),
236 String::from(""),
237 Vec::new(),
238 Vec::new(),
239 );
240 assert_eq!(d, DescribedGroupMember::default());
241 }
242}
243
244impl Readable for DescribedGroupMember {
245 fn read(#[allow(unused)] input: &mut impl Read) -> Result<Self> {
246 let member_id = String::read_ext(input, "member_id", false)?;
247 let client_id = String::read_ext(input, "client_id", false)?;
248 let client_host = String::read_ext(input, "client_host", false)?;
249 let member_metadata = read_bytes(input, "member_metadata", false)?;
250 let member_assignment = read_bytes(input, "member_assignment", false)?;
251 Ok(DescribedGroupMember {
252 member_id, client_id, client_host, member_metadata, member_assignment
253 })
254 }
255}
256
257impl Writable for DescribedGroupMember {
258 fn write(&self, #[allow(unused)] output: &mut impl Write) -> Result<()> {
259 self.member_id.write_ext(output, "self.member_id", false)?;
260 self.client_id.write_ext(output, "self.client_id", false)?;
261 self.client_host.write_ext(output, "self.client_host", false)?;
262 write_bytes(output, "self.member_metadata", &self.member_metadata, false)?;
263 write_bytes(output, "self.member_assignment", &self.member_assignment, false)?;
264 Ok(())
265 }
266}
267
268#[cfg(test)]
269mod tests {
270 use super::*;
271 use proptest::prelude::*;
272
273 #[test]
274 fn test_java_default() {
275 crate::test_utils::test_java_default::<DescribeGroupsResponse>("DescribeGroupsResponse", 1);
276 }
277
278 proptest! {
279 #[test]
280 fn test_serde(data: DescribeGroupsResponse) {
281 crate::test_utils::test_serde(&data)?;
282 }
283 }
284
285 proptest! {
286 #[test]
287 fn test_java_arbitrary(data: DescribeGroupsResponse) {
288 crate::test_utils::test_java_arbitrary(&data, "DescribeGroupsResponse", 1);
289 }
290 }
291}