use crate::ffi::common::{DeRecBuffer, empty_buffer, vec_into_buffer};
use crate::ffi::error::{
DEREC_CODE_FFI_BAD_PROTO, DEREC_CODE_FFI_NULL_PTR, DeRecError, ffi_error, success,
};
#[repr(C)]
pub struct ApplyTraceIdResult {
pub error: DeRecError,
pub wire_bytes: DeRecBuffer,
}
#[repr(C)]
pub struct ReadTraceIdResult {
pub error: DeRecError,
pub trace_id: u64,
}
#[unsafe(no_mangle)]
pub extern "C" fn apply_trace_id_to_envelope(
envelope_ptr: *const u8,
envelope_len: usize,
trace_id: u64,
) -> ApplyTraceIdResult {
let with_err = |error| ApplyTraceIdResult {
error,
wire_bytes: empty_buffer(),
};
if envelope_ptr.is_null() && envelope_len > 0 {
return with_err(ffi_error(DEREC_CODE_FFI_NULL_PTR, "envelope_ptr is null"));
}
let bytes = if envelope_len == 0 {
&[][..]
} else {
unsafe { std::slice::from_raw_parts(envelope_ptr, envelope_len) }
};
match crate::derec_message::apply_trace_id(bytes, trace_id) {
Ok(out) => ApplyTraceIdResult {
error: success(),
wire_bytes: vec_into_buffer(out),
},
Err(_) => with_err(ffi_error(
DEREC_CODE_FFI_BAD_PROTO,
"failed to decode DeRecMessage envelope",
)),
}
}
#[unsafe(no_mangle)]
pub extern "C" fn read_trace_id_from_envelope(
envelope_ptr: *const u8,
envelope_len: usize,
) -> ReadTraceIdResult {
if envelope_ptr.is_null() && envelope_len > 0 {
return ReadTraceIdResult {
error: ffi_error(DEREC_CODE_FFI_NULL_PTR, "envelope_ptr is null"),
trace_id: 0,
};
}
let bytes = if envelope_len == 0 {
&[][..]
} else {
unsafe { std::slice::from_raw_parts(envelope_ptr, envelope_len) }
};
match crate::derec_message::read_trace_id(bytes) {
Ok(trace_id) => ReadTraceIdResult {
error: success(),
trace_id,
},
Err(_) => ReadTraceIdResult {
error: ffi_error(
DEREC_CODE_FFI_BAD_PROTO,
"failed to decode DeRecMessage envelope",
),
trace_id: 0,
},
}
}