#![allow(dead_code)]
use std::ffi::c_char;
use blazen_uniffi::persist::{
PersistedEvent as InnerPersistedEvent, WorkflowCheckpoint as InnerWorkflowCheckpoint,
};
use crate::string::{alloc_cstring, cstr_to_str};
pub struct BlazenPersistedEvent(pub(crate) InnerPersistedEvent);
impl BlazenPersistedEvent {
pub(crate) fn into_ptr(self) -> *mut BlazenPersistedEvent {
Box::into_raw(Box::new(self))
}
}
impl From<InnerPersistedEvent> for BlazenPersistedEvent {
fn from(inner: InnerPersistedEvent) -> Self {
Self(inner)
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_persisted_event_new(
event_type: *const c_char,
data_json: *const c_char,
) -> *mut BlazenPersistedEvent {
let Some(event_type) = (unsafe { cstr_to_str(event_type) }) else {
return std::ptr::null_mut();
};
let Some(data_json) = (unsafe { cstr_to_str(data_json) }) else {
return std::ptr::null_mut();
};
BlazenPersistedEvent::from(InnerPersistedEvent {
event_type: event_type.to_owned(),
data_json: data_json.to_owned(),
})
.into_ptr()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_persisted_event_event_type(
event: *const BlazenPersistedEvent,
) -> *mut c_char {
if event.is_null() {
return std::ptr::null_mut();
}
let event = unsafe { &*event };
alloc_cstring(&event.0.event_type)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_persisted_event_data_json(
event: *const BlazenPersistedEvent,
) -> *mut c_char {
if event.is_null() {
return std::ptr::null_mut();
}
let event = unsafe { &*event };
alloc_cstring(&event.0.data_json)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_persisted_event_free(event: *mut BlazenPersistedEvent) {
if event.is_null() {
return;
}
drop(unsafe { Box::from_raw(event) });
}
pub struct BlazenWorkflowCheckpoint(pub(crate) InnerWorkflowCheckpoint);
impl BlazenWorkflowCheckpoint {
pub(crate) fn into_ptr(self) -> *mut BlazenWorkflowCheckpoint {
Box::into_raw(Box::new(self))
}
}
impl From<InnerWorkflowCheckpoint> for BlazenWorkflowCheckpoint {
fn from(inner: InnerWorkflowCheckpoint) -> Self {
Self(inner)
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_workflow_checkpoint_new(
workflow_name: *const c_char,
run_id: *const c_char,
state_json: *const c_char,
metadata_json: *const c_char,
timestamp_ms: u64,
) -> *mut BlazenWorkflowCheckpoint {
let Some(workflow_name) = (unsafe { cstr_to_str(workflow_name) }) else {
return std::ptr::null_mut();
};
let Some(run_id) = (unsafe { cstr_to_str(run_id) }) else {
return std::ptr::null_mut();
};
let Some(state_json) = (unsafe { cstr_to_str(state_json) }) else {
return std::ptr::null_mut();
};
let Some(metadata_json) = (unsafe { cstr_to_str(metadata_json) }) else {
return std::ptr::null_mut();
};
BlazenWorkflowCheckpoint::from(InnerWorkflowCheckpoint {
workflow_name: workflow_name.to_owned(),
run_id: run_id.to_owned(),
timestamp_ms,
state_json: state_json.to_owned(),
pending_events: Vec::new(),
metadata_json: metadata_json.to_owned(),
})
.into_ptr()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_workflow_checkpoint_pending_events_push(
checkpoint: *mut BlazenWorkflowCheckpoint,
event: *mut BlazenPersistedEvent,
) -> i32 {
if checkpoint.is_null() {
if !event.is_null() {
drop(unsafe { Box::from_raw(event) });
}
return -1;
}
if event.is_null() {
return -1;
}
let event = unsafe { Box::from_raw(event) }.0;
let checkpoint = unsafe { &mut *checkpoint };
checkpoint.0.pending_events.push(event);
0
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_workflow_checkpoint_workflow_name(
checkpoint: *const BlazenWorkflowCheckpoint,
) -> *mut c_char {
if checkpoint.is_null() {
return std::ptr::null_mut();
}
let checkpoint = unsafe { &*checkpoint };
alloc_cstring(&checkpoint.0.workflow_name)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_workflow_checkpoint_run_id(
checkpoint: *const BlazenWorkflowCheckpoint,
) -> *mut c_char {
if checkpoint.is_null() {
return std::ptr::null_mut();
}
let checkpoint = unsafe { &*checkpoint };
alloc_cstring(&checkpoint.0.run_id)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_workflow_checkpoint_timestamp_ms(
checkpoint: *const BlazenWorkflowCheckpoint,
) -> u64 {
if checkpoint.is_null() {
return 0;
}
let checkpoint = unsafe { &*checkpoint };
checkpoint.0.timestamp_ms
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_workflow_checkpoint_state_json(
checkpoint: *const BlazenWorkflowCheckpoint,
) -> *mut c_char {
if checkpoint.is_null() {
return std::ptr::null_mut();
}
let checkpoint = unsafe { &*checkpoint };
alloc_cstring(&checkpoint.0.state_json)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_workflow_checkpoint_metadata_json(
checkpoint: *const BlazenWorkflowCheckpoint,
) -> *mut c_char {
if checkpoint.is_null() {
return std::ptr::null_mut();
}
let checkpoint = unsafe { &*checkpoint };
alloc_cstring(&checkpoint.0.metadata_json)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_workflow_checkpoint_pending_events_count(
checkpoint: *const BlazenWorkflowCheckpoint,
) -> usize {
if checkpoint.is_null() {
return 0;
}
let checkpoint = unsafe { &*checkpoint };
checkpoint.0.pending_events.len()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_workflow_checkpoint_pending_events_get(
checkpoint: *const BlazenWorkflowCheckpoint,
idx: usize,
) -> *mut BlazenPersistedEvent {
if checkpoint.is_null() {
return std::ptr::null_mut();
}
let checkpoint = unsafe { &*checkpoint };
checkpoint
.0
.pending_events
.get(idx)
.map_or(std::ptr::null_mut(), |event| {
BlazenPersistedEvent::from(event.clone()).into_ptr()
})
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_workflow_checkpoint_free(
checkpoint: *mut BlazenWorkflowCheckpoint,
) {
if checkpoint.is_null() {
return;
}
drop(unsafe { Box::from_raw(checkpoint) });
}