use std::ffi::c_char;
use opendp_derive::bootstrap;
use crate::{
core::{FfiResult, Function, Measurement, PrivacyMap},
error::Fallible,
ffi::any::{
AnyDomain, AnyMeasure, AnyMeasurement, AnyMetric, AnyObject, CallbackFn, wrap_func,
},
};
#[bootstrap(
name = "make_user_measurement",
features("contrib", "honest-but-curious"),
arguments(
input_domain(hint = "Domain"),
input_metric(hint = "Metric"),
output_measure(hint = "Measure"),
function(rust_type = "$pass_through(TO)"),
privacy_map(rust_type = "$measure_distance_type(output_measure)"),
),
generics(TO(default = "ExtrinsicObject"))
)]
#[allow(dead_code)]
fn make_user_measurement<TO>(
input_domain: AnyDomain,
input_metric: AnyMetric,
output_measure: AnyMeasure,
function: *const CallbackFn,
privacy_map: *const CallbackFn,
) -> Fallible<Measurement<AnyDomain, AnyMetric, AnyMeasure, AnyObject>> {
let _ = (
input_domain,
input_metric,
output_measure,
privacy_map,
function,
);
panic!("this signature only exists for code generation")
}
#[unsafe(no_mangle)]
pub extern "C" fn opendp_measurements__make_user_measurement(
input_domain: *const AnyDomain,
input_metric: *const AnyMetric,
output_measure: *const AnyMeasure,
function: *const CallbackFn,
privacy_map: *const CallbackFn,
TO: *const c_char,
) -> FfiResult<*mut AnyMeasurement> {
let _TO = TO;
Measurement::new(
try_as_ref!(input_domain).clone(),
try_as_ref!(input_metric).clone(),
try_as_ref!(output_measure).clone(),
Function::new_fallible(wrap_func(try_as_ref!(function).clone())),
PrivacyMap::new_fallible(wrap_func(try_as_ref!(privacy_map).clone())),
)
.into()
}