use opendp_derive::bootstrap;
use crate::{
core::{FfiResult, Function, StabilityMap, Transformation},
ffi::any::{AnyDomain, AnyMetric, AnyTransformation, CallbackFn, wrap_func},
};
#[bootstrap(
name = "make_user_transformation",
features("contrib", "honest-but-curious"),
arguments(
input_domain(hint = "Domain"),
input_metric(hint = "Metric"),
output_domain(hint = "Domain"),
output_metric(hint = "Metric"),
function(rust_type = "$domain_carrier_type(output_domain)"),
stability_map(rust_type = "$metric_distance_type(output_metric)"),
)
)]
#[unsafe(no_mangle)]
pub extern "C" fn opendp_transformations__make_user_transformation(
input_domain: *const AnyDomain,
input_metric: *const AnyMetric,
output_domain: *const AnyDomain,
output_metric: *const AnyMetric,
function: *const CallbackFn,
stability_map: *const CallbackFn,
) -> FfiResult<*mut AnyTransformation> {
Transformation::new(
try_as_ref!(input_domain).clone(),
try_as_ref!(input_metric).clone(),
try_as_ref!(output_domain).clone(),
try_as_ref!(output_metric).clone(),
Function::new_fallible(wrap_func(try_as_ref!(function).clone())),
StabilityMap::new_fallible(wrap_func(try_as_ref!(stability_map).clone())),
)
.into()
}