1#![warn(missing_docs)]
47
48mod download;
49mod error;
50mod loader;
51mod symbols;
52
53pub use error::{BamlSysError, Result};
54use libc::{c_char, c_int, c_void, size_t};
55pub use loader::{
56 ensure_library, set_library_path, ENV_CACHE_DIR, ENV_DISABLE_DOWNLOAD, ENV_LIBRARY_PATH,
57 VERSION,
58};
59pub use symbols::{get_symbols, Buffer, CallbackFn, OnTickCallbackFn, Symbols};
60
61pub fn version() -> Result<String> {
67 let symbols = get_symbols()?;
68 #[allow(unsafe_code)]
70 let buf = unsafe { (symbols.version)() };
71
72 let result = if !buf.ptr.is_null() && buf.len > 0 {
73 #[allow(unsafe_code)]
74 let bytes = unsafe { std::slice::from_raw_parts(buf.ptr as *const u8, buf.len) };
75 String::from_utf8_lossy(bytes).into_owned()
76 } else {
77 "unknown".to_string()
78 };
79
80 #[allow(unsafe_code)]
82 unsafe {
83 (symbols.free_buffer)(buf);
84 }
85
86 Ok(result)
87}
88
89#[allow(unsafe_code)]
94pub unsafe fn register_callbacks(
95 callback_fn: CallbackFn,
96 error_callback_fn: CallbackFn,
97 on_tick_callback_fn: OnTickCallbackFn,
98) -> Result<()> {
99 let symbols = get_symbols()?;
100 unsafe {
101 (symbols.register_callbacks)(callback_fn, error_callback_fn, on_tick_callback_fn);
102 }
103 Ok(())
104}
105
106#[allow(unsafe_code)]
111pub unsafe fn create_baml_runtime(
112 root_path: *const c_char,
113 src_files_json: *const c_char,
114 env_vars_json: *const c_char,
115) -> Result<*const c_void> {
116 let symbols = get_symbols()?;
117 Ok(unsafe { (symbols.create_baml_runtime)(root_path, src_files_json, env_vars_json) })
118}
119
120#[allow(unsafe_code)]
125pub unsafe fn destroy_baml_runtime(runtime: *const c_void) -> Result<()> {
126 let symbols = get_symbols()?;
127 unsafe {
128 (symbols.destroy_baml_runtime)(runtime);
129 }
130 Ok(())
131}
132
133#[allow(unsafe_code)]
138pub unsafe fn invoke_runtime_cli(args: *const *const c_char) -> Result<c_int> {
139 let symbols = get_symbols()?;
140 Ok(unsafe { (symbols.invoke_runtime_cli)(args) })
141}
142
143#[allow(unsafe_code)]
151pub unsafe fn call_function_from_c(
152 runtime: *const c_void,
153 function_name: *const c_char,
154 encoded_args: *const c_char,
155 length: size_t,
156 id: u32,
157) -> Result<Buffer> {
158 let symbols = get_symbols()?;
159 Ok(unsafe { (symbols.call_function_from_c)(runtime, function_name, encoded_args, length, id) })
160}
161
162#[allow(unsafe_code)]
170pub unsafe fn call_function_stream_from_c(
171 runtime: *const c_void,
172 function_name: *const c_char,
173 encoded_args: *const c_char,
174 length: size_t,
175 id: u32,
176) -> Result<Buffer> {
177 let symbols = get_symbols()?;
178 Ok(unsafe {
179 (symbols.call_function_stream_from_c)(runtime, function_name, encoded_args, length, id)
180 })
181}
182
183#[allow(unsafe_code)]
191pub unsafe fn call_function_parse_from_c(
192 runtime: *const c_void,
193 function_name: *const c_char,
194 encoded_args: *const c_char,
195 length: size_t,
196 id: u32,
197) -> Result<Buffer> {
198 let symbols = get_symbols()?;
199 Ok(unsafe {
200 (symbols.call_function_parse_from_c)(runtime, function_name, encoded_args, length, id)
201 })
202}
203
204#[allow(unsafe_code)]
212pub unsafe fn cancel_function_call(id: u32) -> Result<Buffer> {
213 let symbols = get_symbols()?;
214 Ok(unsafe { (symbols.cancel_function_call)(id) })
215}
216
217#[allow(unsafe_code)]
222pub unsafe fn call_object_constructor(
223 encoded_invocation: *const c_char,
224 length: size_t,
225) -> Result<Buffer> {
226 let symbols = get_symbols()?;
227 Ok(unsafe { (symbols.call_object_constructor)(encoded_invocation, length) })
228}
229
230#[allow(unsafe_code)]
235pub unsafe fn call_object_method(
236 runtime: *const c_void,
237 encoded_invocation: *const c_char,
238 length: size_t,
239) -> Result<Buffer> {
240 let symbols = get_symbols()?;
241 Ok(unsafe { (symbols.call_object_method)(runtime, encoded_invocation, length) })
242}
243
244#[allow(unsafe_code)]
249pub unsafe fn free_buffer(buf: Buffer) -> Result<()> {
250 let symbols = get_symbols()?;
251 unsafe {
252 (symbols.free_buffer)(buf);
253 }
254 Ok(())
255}
256
257pub fn library_path() -> Result<std::path::PathBuf> {
259 let lib = loader::get_library()?;
260 Ok(lib.path.clone())
261}