use std::ffi::{c_char, CString};
pub(crate) fn take_ownership_string(s: CString) -> *mut c_char {
s.into_raw()
}
#[no_mangle]
pub unsafe extern "C" fn laminar_string_free(s: *mut c_char) {
if !s.is_null() {
drop(unsafe { CString::from_raw(s) });
}
}
#[no_mangle]
pub extern "C" fn laminar_version() -> *const c_char {
static VERSION: &[u8] = concat!(env!("CARGO_PKG_VERSION"), "\0").as_bytes();
VERSION.as_ptr().cast()
}
#[cfg(test)]
mod tests {
use super::*;
use std::ffi::CStr;
#[test]
fn test_string_free_null() {
unsafe {
laminar_string_free(std::ptr::null_mut());
}
}
#[test]
fn test_string_round_trip() {
let original = "Hello, FFI!";
let c_string = CString::new(original).unwrap();
let ptr = take_ownership_string(c_string);
let retrieved = unsafe { CStr::from_ptr(ptr).to_str().unwrap() };
assert_eq!(retrieved, original);
unsafe { laminar_string_free(ptr) };
}
#[test]
fn test_version() {
let ptr = laminar_version();
assert!(!ptr.is_null());
let version = unsafe { CStr::from_ptr(ptr).to_str().unwrap() };
assert!(!version.is_empty());
assert!(version.chars().any(|c| c.is_ascii_digit()));
}
}