kafka_wire_protocol/schema/consumer_protocol_subscription/
v3.rs1use 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_nullable_bytes, write_nullable_bytes};
10use crate::markers::{ApiMessage, Data};
11use crate::readable_writable::{Readable, Writable};
12#[cfg(test)] use crate::test_utils::{proptest_strategies, serde_option_bytes};
13
14#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
16#[cfg_attr(test, derive(Arbitrary))]
17pub struct ConsumerProtocolSubscription {
18 #[cfg_attr(test, proptest(strategy = "proptest_strategies::vec()"))]
20 pub topics: Vec<String>,
21 #[cfg_attr(test, proptest(strategy = "proptest_strategies::optional_bytes()"))]
23 #[cfg_attr(test, serde(with="serde_option_bytes"))]
24 pub user_data: Option<Vec<u8>>,
25 #[cfg_attr(test, proptest(strategy = "proptest_strategies::vec()"))]
27 pub owned_partitions: Vec<TopicPartition>,
28 pub generation_id: i32,
30 #[cfg_attr(test, proptest(strategy = "proptest_strategies::optional_string()"))]
32 pub rack_id: Option<String>,
33}
34
35impl ApiMessage for ConsumerProtocolSubscription {
36 fn api_key(&self) -> i16 {
37 -1
38 }
39
40 fn version(&self) -> i16 {
41 3
42 }
43}
44
45impl Data for ConsumerProtocolSubscription { }
46
47impl Default for ConsumerProtocolSubscription {
48 fn default() -> Self {
49 ConsumerProtocolSubscription {
50 topics: Vec::<String>::new(),
51 user_data: None,
52 owned_partitions: Vec::<TopicPartition>::new(),
53 generation_id: -1_i32,
54 rack_id: None,
55 }
56 }
57}
58
59impl ConsumerProtocolSubscription {
60 pub fn new<S1: AsRef<str>>(topics: Vec<String>, user_data: Option<Vec<u8>>, owned_partitions: Vec<TopicPartition>, generation_id: i32, rack_id: Option<S1>) -> Self {
61 Self {
62 topics,
63 user_data,
64 owned_partitions,
65 generation_id,
66 rack_id: rack_id.map(|s| s.as_ref().to_string()),
67 }
68 }
69}
70
71#[cfg(test)]
72mod tests_consumer_protocol_subscription_new_and_default {
73 use super::*;
74
75 #[test]
76 fn test() {
77 let d = ConsumerProtocolSubscription::new(
78 Vec::<String>::new(),
79 None::<Vec::<u8>>,
80 Vec::<TopicPartition>::new(),
81 -1_i32,
82 None::<String>,
83 );
84 assert_eq!(d, ConsumerProtocolSubscription::default());
85 }
86}
87
88impl Readable for ConsumerProtocolSubscription {
89 fn read(#[allow(unused)] input: &mut impl Read) -> Result<Self> {
90 let topics = read_array::<String>(input, "topics", false)?;
91 let user_data = read_nullable_bytes(input, "user_data", false)?;
92 let owned_partitions = read_array::<TopicPartition>(input, "owned_partitions", false)?;
93 let generation_id = i32::read(input)?;
94 let rack_id = Option::<String>::read_ext(input, "rack_id", false)?;
95 Ok(ConsumerProtocolSubscription {
96 topics, user_data, owned_partitions, generation_id, rack_id
97 })
98 }
99}
100
101impl Writable for ConsumerProtocolSubscription {
102 fn write(&self, #[allow(unused)] output: &mut impl Write) -> Result<()> {
103 write_array(output, "self.topics", &self.topics, false)?;
104 write_nullable_bytes(output, "self.user_data", self.user_data.as_deref(), false)?;
105 write_array(output, "self.owned_partitions", &self.owned_partitions, false)?;
106 self.generation_id.write(output)?;
107 self.rack_id.write_ext(output, "self.rack_id", false)?;
108 Ok(())
109 }
110}
111
112#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
114#[cfg_attr(test, derive(Arbitrary))]
115pub struct TopicPartition {
116 #[cfg_attr(test, proptest(strategy = "proptest_strategies::string()"))]
118 pub topic: String,
119 #[cfg_attr(test, proptest(strategy = "proptest_strategies::vec()"))]
121 pub partitions: Vec<i32>,
122}
123
124impl Default for TopicPartition {
125 fn default() -> Self {
126 TopicPartition {
127 topic: String::from(""),
128 partitions: Vec::<i32>::new(),
129 }
130 }
131}
132
133impl TopicPartition {
134 pub fn new<S1: AsRef<str>>(topic: S1, partitions: Vec<i32>) -> Self {
135 Self {
136 topic: topic.as_ref().to_string(),
137 partitions,
138 }
139 }
140}
141
142#[cfg(test)]
143mod tests_topic_partition_new_and_default {
144 use super::*;
145
146 #[test]
147 fn test() {
148 let d = TopicPartition::new(
149 String::from(""),
150 Vec::<i32>::new(),
151 );
152 assert_eq!(d, TopicPartition::default());
153 }
154}
155
156impl Readable for TopicPartition {
157 fn read(#[allow(unused)] input: &mut impl Read) -> Result<Self> {
158 let topic = String::read_ext(input, "topic", false)?;
159 let partitions = read_array::<i32>(input, "partitions", false)?;
160 Ok(TopicPartition {
161 topic, partitions
162 })
163 }
164}
165
166impl Writable for TopicPartition {
167 fn write(&self, #[allow(unused)] output: &mut impl Write) -> Result<()> {
168 self.topic.write_ext(output, "self.topic", false)?;
169 write_array(output, "self.partitions", &self.partitions, false)?;
170 Ok(())
171 }
172}
173
174#[cfg(test)]
175mod tests {
176 use super::*;
177 use proptest::prelude::*;
178
179 #[test]
180 fn test_java_default() {
181 crate::test_utils::test_java_default::<ConsumerProtocolSubscription>("ConsumerProtocolSubscription", 3);
182 }
183
184 proptest! {
185 #[test]
186 fn test_serde(data: ConsumerProtocolSubscription) {
187 crate::test_utils::test_serde(&data)?;
188 }
189 }
190
191 proptest! {
192 #[test]
193 fn test_java_arbitrary(data: ConsumerProtocolSubscription) {
194 crate::test_utils::test_java_arbitrary(&data, "ConsumerProtocolSubscription", 3);
195 }
196 }
197}