#![allow(dead_code)]
use std::ffi::c_char;
use blazen_uniffi::streaming::StreamChunk as InnerStreamChunk;
use crate::llm_records::BlazenToolCall;
use crate::string::{alloc_cstring, cstr_to_str};
pub struct BlazenStreamChunk(pub(crate) InnerStreamChunk);
impl BlazenStreamChunk {
pub(crate) fn into_ptr(self) -> *mut BlazenStreamChunk {
Box::into_raw(Box::new(self))
}
}
impl From<InnerStreamChunk> for BlazenStreamChunk {
fn from(inner: InnerStreamChunk) -> Self {
Self(inner)
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_stream_chunk_new(
content_delta: *const c_char,
is_final: bool,
) -> *mut BlazenStreamChunk {
let content_delta = match unsafe { cstr_to_str(content_delta) } {
Some(s) => s.to_owned(),
None => return std::ptr::null_mut(),
};
BlazenStreamChunk(InnerStreamChunk {
content_delta,
tool_calls: Vec::new(),
is_final,
})
.into_ptr()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_stream_chunk_tool_calls_push(
handle: *mut BlazenStreamChunk,
tool_call: *mut BlazenToolCall,
) {
if tool_call.is_null() {
return;
}
let tc_box = unsafe { Box::from_raw(tool_call) };
if handle.is_null() {
drop(tc_box);
return;
}
let c = unsafe { &mut *handle };
c.0.tool_calls.push(tc_box.0);
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_stream_chunk_content_delta(
handle: *const BlazenStreamChunk,
) -> *mut c_char {
if handle.is_null() {
return std::ptr::null_mut();
}
let c = unsafe { &*handle };
alloc_cstring(&c.0.content_delta)
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_stream_chunk_is_final(handle: *const BlazenStreamChunk) -> bool {
if handle.is_null() {
return false;
}
let c = unsafe { &*handle };
c.0.is_final
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_stream_chunk_tool_calls_count(
handle: *const BlazenStreamChunk,
) -> usize {
if handle.is_null() {
return 0;
}
let c = unsafe { &*handle };
c.0.tool_calls.len()
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_stream_chunk_tool_calls_get(
handle: *const BlazenStreamChunk,
idx: usize,
) -> *mut BlazenToolCall {
if handle.is_null() {
return std::ptr::null_mut();
}
let c = unsafe { &*handle };
match c.0.tool_calls.get(idx) {
Some(tc) => BlazenToolCall(tc.clone()).into_ptr(),
None => std::ptr::null_mut(),
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn blazen_stream_chunk_free(handle: *mut BlazenStreamChunk) {
if handle.is_null() {
return;
}
drop(unsafe { Box::from_raw(handle) });
}