dd-sensitive-data-scanner 0.0.0

Core Sensitive Data Scanner library for detecting and redacting sensitive information.
Documentation
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};

/// # Safety
///
/// This function makes use of `read_json` which is unsafe as it dereferences a pointer to a c_char.
/// The caller must ensure that the pointer is valid and points to a valid JSON string.
#[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() };

        // create the scanner
        let scanner = match Scanner::builder(&rules)
            .labels(labels)
            .with_debug_observability(enable_debug_observability != 0)
            .build()
        {
            Ok(s) => s,
            Err(err) => return err.into(),
        };

        // return a scanner id using the object address
        let scanner_address = Arc::into_raw(Arc::new(scanner));
        scanner_address as usize as i64
    })
}