slow5lib-sys 0.2.0

Low-level bindings to the slow5lib C library
Documentation
extern crate slow5lib_sys;

use std::ptr::null_mut;
use std::{error::Error, ffi::CString};

fn to_picoamps(raw_val: i16, digitisation: f64, offset: f64, range: f64) -> f64 {
    ((raw_val as f64) + offset) * (range / digitisation)
}

#[test]
fn main() -> Result<(), Box<dyn Error>> {
    unsafe {
        let file_path = CString::new("slow5lib/examples/example.slow5")?;
        let mode = CString::new("r")?;
        let sp = slow5lib_sys::slow5_open(file_path.as_ptr(), mode.as_ptr());

        let mut rec: *mut slow5lib_sys::slow5_rec_t = null_mut();

        let ret = slow5lib_sys::slow5_idx_load(sp);
        if ret < 0 {
            panic!("Error in loading index");
        }

        let read_id = CString::new("r3")?;
        let rec_mut_ptr: *mut *mut slow5lib_sys::slow5_rec_t = &mut rec;
        let ret = slow5lib_sys::slow5_get(read_id.as_ptr(), rec_mut_ptr, sp);
        if ret < 0 {
            panic!("Error in fetching the read");
        } else {
            println!("{:?}", (*rec).read_id);
            let len_raw_signal = (*rec).len_raw_signal;
            for i in 0..len_raw_signal {
                let picoamp = to_picoamps(
                    *(*rec).raw_signal.offset(i as isize),
                    (*rec).digitisation,
                    (*rec).offset,
                    (*rec).range,
                );
                println!("{}", picoamp);
            }
        }

        slow5lib_sys::slow5_rec_free(rec);
        slow5lib_sys::slow5_idx_unload(sp);
        slow5lib_sys::slow5_close(sp);
        Ok(())
    }
}