use std::ffi::c_char;
use std::mem::ManuallyDrop;
use std::sync::Arc;
use crate::Scanner;
use super::{RuleList, handle_panic_ptr_return, read_json};
#[unsafe(no_mangle)]
pub unsafe extern "C" fn create_scanner(
rules: i64,
encoded_labels: *const c_char,
enable_debug_observability: i32,
error_out: *mut *const c_char,
) -> i64 {
handle_panic_ptr_return(Some(error_out), || {
let rules_mutex =
ManuallyDrop::new(unsafe { RuleList::from_raw(rules as usize as *const _) });
let rules = rules_mutex.lock().unwrap();
let labels = unsafe { read_json(encoded_labels).unwrap() };
let scanner = match Scanner::builder(&rules)
.labels(labels)
.with_debug_observability(enable_debug_observability != 0)
.build()
{
Ok(s) => s,
Err(err) => return err.into(),
};
let scanner_address = Arc::into_raw(Arc::new(scanner));
scanner_address as usize as i64
})
}