pact_ffi/models/
iterators.rs1use std::panic::RefUnwindSafe;
4
5use tracing::trace;
6
7use pact_models::message::Message;
8use pact_models::message_pact::MessagePact;
9use pact_models::v4::pact::V4Pact;
10use pact_models::v4::async_message::AsynchronousMessage;
11use pact_models::v4::sync_message::SynchronousMessage;
12use pact_models::v4::synch_http::SynchronousHttp;
13use pact_models::v4::V4InteractionType;
14
15use crate::{as_mut, ffi_fn};
16use crate::models::PactInteraction;
17use crate::ptr;
18
19ffi_fn! {
20 fn pactffi_pact_message_iter_delete(iter: *mut PactMessageIterator) {
22 ptr::drop_raw(iter);
23 }
24}
25
26#[derive(Debug)]
28#[allow(missing_copy_implementations)]
29pub struct PactMessageIterator {
30 current: usize,
31 message_pact: MessagePact,
32}
33
34impl PactMessageIterator {
35 pub fn new(message_pact: MessagePact) -> Self {
37 PactMessageIterator {
38 current: 0,
39 message_pact
40 }
41 }
42
43 fn next(&mut self) -> Option<&mut Message> {
45 let idx = self.current;
46 self.current += 1;
47 self.message_pact.messages.get_mut(idx)
48 }
49}
50
51ffi_fn! {
52 fn pactffi_pact_message_iter_next(iter: *mut PactMessageIterator) -> *mut Message {
68 let iter = as_mut!(iter);
69 match iter.next() {
70 Some(message) => message as *mut Message,
71 None => {
72 trace!("iter past the end of messages");
73 std::ptr::null_mut()
74 }
75 }
76 } {
77 std::ptr::null_mut()
78 }
79}
80
81#[derive(Debug)]
83#[allow(missing_copy_implementations)]
84pub struct PactAsyncMessageIterator {
85 current: usize,
86 messages: Vec<AsynchronousMessage>
87}
88
89impl PactAsyncMessageIterator {
90 pub fn new(pact: V4Pact) -> Self {
92 PactAsyncMessageIterator {
93 current: 0,
94 messages: pact.filter_interactions(V4InteractionType::Asynchronous_Messages)
95 .iter()
96 .map(|i| i.as_v4_async_message().unwrap())
97 .collect()
98 }
99 }
100
101 fn next(&mut self) -> Option<&mut AsynchronousMessage> {
103 let idx = self.current;
104 self.current += 1;
105 self.messages.get_mut(idx)
106 }
107}
108
109ffi_fn! {
110 fn pactffi_pact_async_message_iter_next(iter: *mut PactAsyncMessageIterator) -> *mut AsynchronousMessage {
129 let iter = as_mut!(iter);
130 match iter.next() {
131 Some(message) => message as *mut AsynchronousMessage,
132 None => {
133 trace!("iter past the end of messages");
134 std::ptr::null_mut()
135 }
136 }
137 } {
138 std::ptr::null_mut()
139 }
140}
141
142ffi_fn! {
143 fn pactffi_pact_async_message_iter_delete(iter: *mut PactAsyncMessageIterator) {
145 ptr::drop_raw(iter);
146 }
147}
148
149#[derive(Debug)]
151#[allow(missing_copy_implementations)]
152pub struct PactSyncMessageIterator {
153 current: usize,
154 messages: Vec<SynchronousMessage>
155}
156
157impl PactSyncMessageIterator {
158 pub fn new(pact: V4Pact) -> Self {
160 PactSyncMessageIterator {
161 current: 0,
162 messages: pact.filter_interactions(V4InteractionType::Synchronous_Messages)
163 .iter()
164 .map(|i| i.as_v4_sync_message().unwrap())
165 .collect()
166 }
167 }
168
169 fn next(&mut self) -> Option<&mut SynchronousMessage> {
171 let idx = self.current;
172 self.current += 1;
173 self.messages.get_mut(idx)
174 }
175}
176
177ffi_fn! {
178 fn pactffi_pact_sync_message_iter_next(iter: *mut PactSyncMessageIterator) -> *mut SynchronousMessage {
194 let iter = as_mut!(iter);
195 match iter.next() {
196 Some(message) => message as *mut SynchronousMessage,
197 None => {
198 trace!("iter past the end of messages");
199 std::ptr::null_mut()
200 }
201 }
202 } {
203 std::ptr::null_mut()
204 }
205}
206
207ffi_fn! {
208 fn pactffi_pact_sync_message_iter_delete(iter: *mut PactSyncMessageIterator) {
210 ptr::drop_raw(iter);
211 }
212}
213
214#[derive(Debug)]
216#[allow(missing_copy_implementations)]
217pub struct PactSyncHttpIterator {
218 current: usize,
219 interactions: Vec<SynchronousHttp>
220}
221
222impl PactSyncHttpIterator {
223 pub fn new(pact: V4Pact) -> Self {
225 PactSyncHttpIterator {
226 current: 0,
227 interactions: pact.filter_interactions(V4InteractionType::Synchronous_HTTP)
228 .iter()
229 .map(|i| i.as_v4_http().unwrap())
230 .collect()
231 }
232 }
233
234 fn next(&mut self) -> Option<&mut SynchronousHttp> {
236 let idx = self.current;
237 self.current += 1;
238 self.interactions.get_mut(idx)
239 }
240}
241
242ffi_fn! {
243 fn pactffi_pact_sync_http_iter_next(iter: *mut PactSyncHttpIterator) -> *mut SynchronousHttp {
259 let iter = as_mut!(iter);
260 match iter.next() {
261 Some(interaction) => interaction as *mut SynchronousHttp,
262 None => {
263 trace!("iter past the end of the list");
264 std::ptr::null_mut()
265 }
266 }
267 } {
268 std::ptr::null_mut()
269 }
270}
271
272ffi_fn! {
273 fn pactffi_pact_sync_http_iter_delete(iter: *mut PactSyncHttpIterator) {
275 ptr::drop_raw(iter);
276 }
277}
278
279#[derive(Debug)]
281#[allow(missing_copy_implementations)]
282pub struct PactInteractionIterator {
283 current: usize,
284 interactions: Vec<PactInteraction>
285}
286
287impl PactInteractionIterator {
288 pub fn new(pact: Box<dyn pact_models::pact::Pact + Send + Sync + RefUnwindSafe>) -> Self {
290 PactInteractionIterator {
291 current: 0,
292 interactions: pact.interactions().iter()
293 .map(|i| PactInteraction::new(i))
294 .collect()
295 }
296 }
297
298 fn next(&mut self) -> Option<&PactInteraction> {
300 let idx = self.current;
301 self.current += 1;
302 self.interactions.get(idx)
303 }
304}
305
306ffi_fn! {
307 fn pactffi_pact_interaction_iter_next(iter: *mut PactInteractionIterator) -> *const PactInteraction {
323 let iter = as_mut!(iter);
324 match iter.next() {
325 Some(interaction) => interaction as *const PactInteraction,
326 None => {
327 trace!("iter past the end of messages");
328 std::ptr::null()
329 }
330 }
331 } {
332 std::ptr::null()
333 }
334}
335
336ffi_fn! {
337 fn pactffi_pact_interaction_iter_delete(iter: *mut PactInteractionIterator) {
339 ptr::drop_raw(iter);
340 }
341}