use std::panic::RefUnwindSafe;
use tracing::trace;
use pact_models::message::Message;
use pact_models::message_pact::MessagePact;
use pact_models::v4::pact::V4Pact;
use pact_models::v4::async_message::AsynchronousMessage;
use pact_models::v4::sync_message::SynchronousMessage;
use pact_models::v4::synch_http::SynchronousHttp;
use pact_models::v4::V4InteractionType;
use crate::{as_mut, ffi_fn};
use crate::models::PactInteraction;
use crate::ptr;
ffi_fn! {
fn pactffi_pact_message_iter_delete(iter: *mut PactMessageIterator) {
ptr::drop_raw(iter);
}
}
#[derive(Debug)]
#[allow(missing_copy_implementations)]
pub struct PactMessageIterator {
current: usize,
message_pact: MessagePact,
}
impl PactMessageIterator {
pub fn new(message_pact: MessagePact) -> Self {
PactMessageIterator {
current: 0,
message_pact
}
}
fn next(&mut self) -> Option<&mut Message> {
let idx = self.current;
self.current += 1;
self.message_pact.messages.get_mut(idx)
}
}
ffi_fn! {
fn pactffi_pact_message_iter_next(iter: *mut PactMessageIterator) -> *mut Message {
let iter = as_mut!(iter);
match iter.next() {
Some(message) => message as *mut Message,
None => {
trace!("iter past the end of messages");
std::ptr::null_mut()
}
}
} {
std::ptr::null_mut()
}
}
#[derive(Debug)]
#[allow(missing_copy_implementations)]
pub struct PactAsyncMessageIterator {
current: usize,
messages: Vec<AsynchronousMessage>
}
impl PactAsyncMessageIterator {
pub fn new(pact: V4Pact) -> Self {
PactAsyncMessageIterator {
current: 0,
messages: pact.filter_interactions(V4InteractionType::Asynchronous_Messages)
.iter()
.map(|i| i.as_v4_async_message().unwrap())
.collect()
}
}
fn next(&mut self) -> Option<&mut AsynchronousMessage> {
let idx = self.current;
self.current += 1;
self.messages.get_mut(idx)
}
}
ffi_fn! {
fn pactffi_pact_async_message_iter_next(iter: *mut PactAsyncMessageIterator) -> *mut AsynchronousMessage {
let iter = as_mut!(iter);
match iter.next() {
Some(message) => message as *mut AsynchronousMessage,
None => {
trace!("iter past the end of messages");
std::ptr::null_mut()
}
}
} {
std::ptr::null_mut()
}
}
ffi_fn! {
fn pactffi_pact_async_message_iter_delete(iter: *mut PactAsyncMessageIterator) {
ptr::drop_raw(iter);
}
}
#[derive(Debug)]
#[allow(missing_copy_implementations)]
pub struct PactSyncMessageIterator {
current: usize,
messages: Vec<SynchronousMessage>
}
impl PactSyncMessageIterator {
pub fn new(pact: V4Pact) -> Self {
PactSyncMessageIterator {
current: 0,
messages: pact.filter_interactions(V4InteractionType::Synchronous_Messages)
.iter()
.map(|i| i.as_v4_sync_message().unwrap())
.collect()
}
}
fn next(&mut self) -> Option<&mut SynchronousMessage> {
let idx = self.current;
self.current += 1;
self.messages.get_mut(idx)
}
}
ffi_fn! {
fn pactffi_pact_sync_message_iter_next(iter: *mut PactSyncMessageIterator) -> *mut SynchronousMessage {
let iter = as_mut!(iter);
match iter.next() {
Some(message) => message as *mut SynchronousMessage,
None => {
trace!("iter past the end of messages");
std::ptr::null_mut()
}
}
} {
std::ptr::null_mut()
}
}
ffi_fn! {
fn pactffi_pact_sync_message_iter_delete(iter: *mut PactSyncMessageIterator) {
ptr::drop_raw(iter);
}
}
#[derive(Debug)]
#[allow(missing_copy_implementations)]
pub struct PactSyncHttpIterator {
current: usize,
interactions: Vec<SynchronousHttp>
}
impl PactSyncHttpIterator {
pub fn new(pact: V4Pact) -> Self {
PactSyncHttpIterator {
current: 0,
interactions: pact.filter_interactions(V4InteractionType::Synchronous_HTTP)
.iter()
.map(|i| i.as_v4_http().unwrap())
.collect()
}
}
fn next(&mut self) -> Option<&mut SynchronousHttp> {
let idx = self.current;
self.current += 1;
self.interactions.get_mut(idx)
}
}
ffi_fn! {
fn pactffi_pact_sync_http_iter_next(iter: *mut PactSyncHttpIterator) -> *mut SynchronousHttp {
let iter = as_mut!(iter);
match iter.next() {
Some(interaction) => interaction as *mut SynchronousHttp,
None => {
trace!("iter past the end of the list");
std::ptr::null_mut()
}
}
} {
std::ptr::null_mut()
}
}
ffi_fn! {
fn pactffi_pact_sync_http_iter_delete(iter: *mut PactSyncHttpIterator) {
ptr::drop_raw(iter);
}
}
#[derive(Debug)]
#[allow(missing_copy_implementations)]
pub struct PactInteractionIterator {
current: usize,
interactions: Vec<PactInteraction>
}
impl PactInteractionIterator {
pub fn new(pact: Box<dyn pact_models::pact::Pact + Send + Sync + RefUnwindSafe>) -> Self {
PactInteractionIterator {
current: 0,
interactions: pact.interactions().iter()
.map(|i| PactInteraction::new(i))
.collect()
}
}
fn next(&mut self) -> Option<&PactInteraction> {
let idx = self.current;
self.current += 1;
self.interactions.get(idx)
}
}
ffi_fn! {
fn pactffi_pact_interaction_iter_next(iter: *mut PactInteractionIterator) -> *const PactInteraction {
let iter = as_mut!(iter);
match iter.next() {
Some(interaction) => interaction as *const PactInteraction,
None => {
trace!("iter past the end of messages");
std::ptr::null()
}
}
} {
std::ptr::null()
}
}
ffi_fn! {
fn pactffi_pact_interaction_iter_delete(iter: *mut PactInteractionIterator) {
ptr::drop_raw(iter);
}
}