1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
//! FFI wrapper code for pact_matching::models::Provider
use libc::c_char;
pub use pact_models::Provider;
use crate::{as_ref, ffi_fn};
use crate::models::Pact;
use crate::util::*;
ffi_fn! {
/// Get a copy of this provider's name.
///
/// The copy must be deleted with `pactffi_string_delete`.
///
/// # Usage
///
/// ```c
/// // Assuming `file_name` and `json_str` are already defined.
///
/// MessagePact *message_pact = pactffi_message_pact_new_from_json(file_name, json_str);
/// if (message_pact == NULLPTR) {
/// // handle error.
/// }
///
/// Provider *provider = pactffi_message_pact_get_provider(message_pact);
/// if (provider == NULLPTR) {
/// // handle error.
/// }
///
/// char *name = pactffi_provider_get_name(provider);
/// if (name == NULL) {
/// // handle error.
/// }
///
/// printf("%s\n", name);
///
/// pactffi_string_delete(name);
/// ```
///
/// # Errors
///
/// This function will fail if it is passed a NULL pointer,
/// or the Rust string contains an embedded NULL byte.
/// In the case of error, a NULL pointer will be returned.
fn pactffi_provider_get_name(provider: *const Provider) -> *const c_char {
let provider = as_ref!(provider);
string::to_c(&provider.name)? as *const c_char
} {
std::ptr::null()
}
}
ffi_fn! {
/// Get the provider from a Pact. This returns a copy of the provider model, and needs to
/// be cleaned up with `pactffi_pact_provider_delete` when no longer required.
///
/// # Errors
///
/// This function will fail if it is passed a NULL pointer.
/// In the case of error, a NULL pointer will be returned.
fn pactffi_pact_get_provider(pact: *const Pact) -> *const Provider {
let pact = as_ref!(pact);
let inner = pact.inner.lock().unwrap();
let provider = ptr::raw_to(inner.provider());
provider as *const Provider
} {
std::ptr::null()
}
}
ffi_fn! {
/// Frees the memory used by the Pact provider
fn pactffi_pact_provider_delete(provider: *const Provider) {
ptr::drop_raw(provider as *mut Provider);
}
}