use super::{
FfiScopeHandle, NemoFlowScopeType, NemoFlowStatus, ScopeAttributes, c_char, c_str_to_opt_json,
c_str_to_string, clear_last_error, core_scope_api, set_last_error, status_from_error,
unix_micros_to_opt_timestamp,
};
#[unsafe(no_mangle)]
pub unsafe extern "C" fn nemo_flow_get_handle(out: *mut *mut FfiScopeHandle) -> NemoFlowStatus {
clear_last_error();
if out.is_null() {
set_last_error("out pointer is null");
return NemoFlowStatus::NullPointer;
}
match core_scope_api::get_handle() {
Ok(h) => {
unsafe { *out = Box::into_raw(Box::new(FfiScopeHandle(h))) };
NemoFlowStatus::Ok
}
Err(e) => status_from_error(&e),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn nemo_flow_push_scope(
name: *const c_char,
scope_type: NemoFlowScopeType,
parent: *const FfiScopeHandle,
attributes: u32,
data_json: *const c_char,
metadata_json: *const c_char,
input_json: *const c_char,
timestamp_unix_micros: *const i64,
out: *mut *mut FfiScopeHandle,
) -> NemoFlowStatus {
clear_last_error();
if out.is_null() {
set_last_error("out pointer is null");
return NemoFlowStatus::NullPointer;
}
let name = match c_str_to_string(name) {
Ok(s) => s,
Err(status) => return status,
};
let parent_ref = if parent.is_null() {
None
} else {
Some(&unsafe { &*parent }.0)
};
let attrs = ScopeAttributes::from_bits_truncate(attributes);
let data = match c_str_to_opt_json(data_json) {
Some(d) => d,
None => return NemoFlowStatus::InvalidJson,
};
let metadata = match c_str_to_opt_json(metadata_json) {
Some(m) => m,
None => return NemoFlowStatus::InvalidJson,
};
let input = match c_str_to_opt_json(input_json) {
Some(v) => v,
None => return NemoFlowStatus::InvalidJson,
};
let timestamp = match unix_micros_to_opt_timestamp(timestamp_unix_micros) {
Some(v) => v,
None => return NemoFlowStatus::InvalidArg,
};
match core_scope_api::push_scope(
core_scope_api::PushScopeParams::builder()
.name(name.as_str())
.scope_type(scope_type.into())
.parent_opt(parent_ref)
.attributes(attrs)
.data_opt(data)
.metadata_opt(metadata)
.input_opt(input)
.timestamp_opt(timestamp)
.build(),
) {
Ok(h) => {
unsafe { *out = Box::into_raw(Box::new(FfiScopeHandle(h))) };
NemoFlowStatus::Ok
}
Err(e) => status_from_error(&e),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn nemo_flow_pop_scope(
handle: *const FfiScopeHandle,
output_json: *const c_char,
timestamp_unix_micros: *const i64,
) -> NemoFlowStatus {
clear_last_error();
if handle.is_null() {
set_last_error("handle is null");
return NemoFlowStatus::NullPointer;
}
let output = match c_str_to_opt_json(output_json) {
Some(v) => v,
None => return NemoFlowStatus::InvalidJson,
};
let timestamp = match unix_micros_to_opt_timestamp(timestamp_unix_micros) {
Some(v) => v,
None => return NemoFlowStatus::InvalidArg,
};
match core_scope_api::pop_scope(
core_scope_api::PopScopeParams::builder()
.handle_uuid(&unsafe { &*handle }.0.uuid)
.output_opt(output)
.timestamp_opt(timestamp)
.build(),
) {
Ok(()) => NemoFlowStatus::Ok,
Err(e) => status_from_error(&e),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn nemo_flow_event(
name: *const c_char,
parent: *const FfiScopeHandle,
data_json: *const c_char,
metadata_json: *const c_char,
timestamp_unix_micros: *const i64,
) -> NemoFlowStatus {
clear_last_error();
let name = match c_str_to_string(name) {
Ok(s) => s,
Err(status) => return status,
};
let parent_ref = if parent.is_null() {
None
} else {
Some(&unsafe { &*parent }.0)
};
let data = match c_str_to_opt_json(data_json) {
Some(d) => d,
None => return NemoFlowStatus::InvalidJson,
};
let metadata = match c_str_to_opt_json(metadata_json) {
Some(m) => m,
None => return NemoFlowStatus::InvalidJson,
};
let timestamp = match unix_micros_to_opt_timestamp(timestamp_unix_micros) {
Some(v) => v,
None => return NemoFlowStatus::InvalidArg,
};
match core_scope_api::event(
core_scope_api::EmitMarkEventParams::builder()
.name(&name)
.parent_opt(parent_ref)
.data_opt(data)
.metadata_opt(metadata)
.timestamp_opt(timestamp)
.build(),
) {
Ok(()) => NemoFlowStatus::Ok,
Err(e) => status_from_error(&e),
}
}