use super::{
NemoFlowFreeFn, NemoFlowStatus, NemoFlowToolConditionalCb, NemoFlowToolExecInterceptCb,
NemoFlowToolSanitizeCb, c_char, c_str_to_string, clear_last_error, core_registry_api,
status_from_error, wrap_tool_conditional_fn, wrap_tool_exec_intercept_fn,
wrap_tool_request_intercept_fn, wrap_tool_sanitize_fn,
};
macro_rules! ffi_guardrail_tool_api {
($(#[$reg_doc:meta])* $register_name:ident,
$(#[$dereg_doc:meta])* $deregister_name:ident,
$core_register:path, $core_deregister:path, $wrapper:ident) => {
$(#[$reg_doc])*
#[unsafe(no_mangle)]
pub unsafe extern "C" fn $register_name(
name: *const c_char,
priority: i32,
cb: NemoFlowToolSanitizeCb,
user_data: *mut libc::c_void,
free_fn: NemoFlowFreeFn,
) -> NemoFlowStatus {
clear_last_error();
let name = match c_str_to_string(name) {
Ok(s) => s,
Err(status) => return status,
};
let wrapped = $wrapper(cb, user_data, free_fn);
match $core_register(&name, priority, wrapped) {
Ok(()) => NemoFlowStatus::Ok,
Err(e) => status_from_error(&e),
}
}
$(#[$dereg_doc])*
#[unsafe(no_mangle)]
pub unsafe extern "C" fn $deregister_name(
name: *const c_char,
) -> NemoFlowStatus {
clear_last_error();
let name = match c_str_to_string(name) {
Ok(s) => s,
Err(status) => return status,
};
match $core_deregister(&name) {
Ok(_) => NemoFlowStatus::Ok,
Err(e) => status_from_error(&e),
}
}
};
}
ffi_guardrail_tool_api!(
nemo_flow_register_tool_sanitize_request_guardrail,
nemo_flow_deregister_tool_sanitize_request_guardrail,
core_registry_api::register_tool_sanitize_request_guardrail,
core_registry_api::deregister_tool_sanitize_request_guardrail,
wrap_tool_sanitize_fn
);
ffi_guardrail_tool_api!(
nemo_flow_register_tool_sanitize_response_guardrail,
nemo_flow_deregister_tool_sanitize_response_guardrail,
core_registry_api::register_tool_sanitize_response_guardrail,
core_registry_api::deregister_tool_sanitize_response_guardrail,
wrap_tool_sanitize_fn
);
#[unsafe(no_mangle)]
pub unsafe extern "C" fn nemo_flow_register_tool_conditional_execution_guardrail(
name: *const c_char,
priority: i32,
cb: NemoFlowToolConditionalCb,
user_data: *mut libc::c_void,
free_fn: NemoFlowFreeFn,
) -> NemoFlowStatus {
clear_last_error();
let name = match c_str_to_string(name) {
Ok(s) => s,
Err(status) => return status,
};
let wrapped = wrap_tool_conditional_fn(cb, user_data, free_fn);
match core_registry_api::register_tool_conditional_execution_guardrail(&name, priority, wrapped)
{
Ok(()) => NemoFlowStatus::Ok,
Err(e) => status_from_error(&e),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn nemo_flow_deregister_tool_conditional_execution_guardrail(
name: *const c_char,
) -> NemoFlowStatus {
clear_last_error();
let name = match c_str_to_string(name) {
Ok(s) => s,
Err(status) => return status,
};
match core_registry_api::deregister_tool_conditional_execution_guardrail(&name) {
Ok(_) => NemoFlowStatus::Ok,
Err(e) => status_from_error(&e),
}
}
macro_rules! ffi_intercept_tool_api {
($(#[$reg_doc:meta])* $register_name:ident,
$(#[$dereg_doc:meta])* $deregister_name:ident,
$core_register:path, $core_deregister:path, $wrapper:ident) => {
$(#[$reg_doc])*
#[unsafe(no_mangle)]
pub unsafe extern "C" fn $register_name(
name: *const c_char,
priority: i32,
break_chain: bool,
cb: NemoFlowToolSanitizeCb,
user_data: *mut libc::c_void,
free_fn: NemoFlowFreeFn,
) -> NemoFlowStatus {
clear_last_error();
let name = match c_str_to_string(name) {
Ok(s) => s,
Err(status) => return status,
};
let wrapped = $wrapper(cb, user_data, free_fn);
match $core_register(&name, priority, break_chain, wrapped) {
Ok(()) => NemoFlowStatus::Ok,
Err(e) => status_from_error(&e),
}
}
$(#[$dereg_doc])*
#[unsafe(no_mangle)]
pub unsafe extern "C" fn $deregister_name(
name: *const c_char,
) -> NemoFlowStatus {
clear_last_error();
let name = match c_str_to_string(name) {
Ok(s) => s,
Err(status) => return status,
};
match $core_deregister(&name) {
Ok(_) => NemoFlowStatus::Ok,
Err(e) => status_from_error(&e),
}
}
};
}
ffi_intercept_tool_api!(
nemo_flow_register_tool_request_intercept,
nemo_flow_deregister_tool_request_intercept,
core_registry_api::register_tool_request_intercept,
core_registry_api::deregister_tool_request_intercept,
wrap_tool_request_intercept_fn
);
#[unsafe(no_mangle)]
pub unsafe extern "C" fn nemo_flow_register_tool_execution_intercept(
name: *const c_char,
priority: i32,
exec_cb: NemoFlowToolExecInterceptCb,
exec_user_data: *mut libc::c_void,
exec_free: NemoFlowFreeFn,
) -> NemoFlowStatus {
clear_last_error();
let name = match c_str_to_string(name) {
Ok(s) => s,
Err(status) => return status,
};
let exec = wrap_tool_exec_intercept_fn(exec_cb, exec_user_data, exec_free);
match core_registry_api::register_tool_execution_intercept(&name, priority, exec) {
Ok(()) => NemoFlowStatus::Ok,
Err(e) => status_from_error(&e),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn nemo_flow_deregister_tool_execution_intercept(
name: *const c_char,
) -> NemoFlowStatus {
clear_last_error();
let name = match c_str_to_string(name) {
Ok(s) => s,
Err(status) => return status,
};
match core_registry_api::deregister_tool_execution_intercept(&name) {
Ok(_) => NemoFlowStatus::Ok,
Err(e) => status_from_error(&e),
}
}