ragc-core 0.1.1

Core compression and decompression algorithms for the AGC genome compression format
Documentation
// Test that Rust splitter FFI works correctly
use std::ffi::CString;

extern "C" {
    fn ragc_determine_splitters(
        file_path: *const std::os::raw::c_char,
        k: u32,
        segment_size: u32,
        verbosity: u32,
    ) -> *mut SplitterResult;

    fn ragc_free_splitters(result: *mut SplitterResult);
}

#[repr(C)]
struct SplitterResult {
    splitters: *mut u64,
    n_splitters: usize,
    singletons: *mut u64,
    n_singletons: usize,
    duplicates: *mut u64,
    n_duplicates: usize,
}

fn main() {
    let test_file = "/tmp/yeast_test.fa";
    let k = 21;
    let segment_size = 10000;
    let verbosity = 2;

    println!("Testing Rust FFI for splitter detection");
    println!("File: {}", test_file);
    println!("k: {}, segment_size: {}\n", k, segment_size);

    let c_path = CString::new(test_file).unwrap();

    unsafe {
        let result = ragc_determine_splitters(c_path.as_ptr(), k, segment_size, verbosity);

        if result.is_null() {
            eprintln!("ERROR: FFI returned NULL");
            return;
        }

        let r = &*result;

        println!("\n=== FFI Results ===");
        println!("Singletons: {}", r.n_singletons);
        println!("Duplicates: {}", r.n_duplicates);
        println!("Splitters:  {}", r.n_splitters);

        // Show splitters
        if r.n_splitters > 0 {
            println!("\nSplitters:");
            let splitters = std::slice::from_raw_parts(r.splitters, r.n_splitters);
            for (i, &sp) in splitters.iter().enumerate() {
                println!("  {}: {:016x}", i, sp);
            }
        }

        // Clean up
        ragc_free_splitters(result);

        println!("\n✓ FFI test completed successfully!");
    }
}