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);
  }
}