ort2 0.1.2

onnxruntime wrapper c/c++ api
Documentation
use std::ffi::CStr;

use ort2_sys as ffi;

pub(crate) fn get_api_base() -> &'static ffi::OrtApiBase {
    unsafe {
        ffi::OrtGetApiBase()
            .as_ref()
            .expect("failed to get api base")
    }
}

pub(crate) fn get_api() -> &'static ffi::OrtApi {
    unsafe {
        let api = get_api_base().GetApi.expect("failed to get api fn")(ffi::ORT_API_VERSION);
        api.as_ref().expect("failed to get api")
    }
}

pub fn get_api_version() -> String {
    let ver = unsafe {
        let ver = get_api_base()
            .GetVersionString
            .expect("failed to GetVersionString")();
        CStr::from_ptr(ver)
            .to_str()
            .expect("failed to get version string")
    };
    ver.into()
}

macro_rules! api {
    ($ff: ident) => {
        unsafe {
            let rc = crate::api::get_api()
                .$ff
                .expect(&format!("no {}", stringify!($ff)))();
            // tracing::trace!(?rc, stringify!($ff));
            rc
        }
    };

    ($ff: ident, $a1: expr) => {
        unsafe {
            let rc = crate::api::get_api()
                .$ff
                .expect(&format!("no {}", stringify!($ff)))($a1);
            // tracing::trace!(?rc, stringify!($ff));
            rc
        }
    };

    ($ff: ident, $a1: expr, $a2: expr) => {
        unsafe {
            let rc = crate::api::get_api()
                .$ff
                .expect(&format!("no {}", stringify!($ff)))($a1, $a2);
            // tracing::trace!(?rc, stringify!($ff));
            rc
        }
    };

    ($ff: ident, $a1: expr, $a2: expr, $a3: expr) => {
        unsafe {
            let rc = crate::api::get_api()
                .$ff
                .expect(&format!("no {}", stringify!($ff)))($a1, $a2, $a3);
            // tracing::trace!(?rc, stringify!($ff));
            rc
        }
    };

    ($ff: ident, $a1: expr, $a2: expr, $a3: expr, $a4: expr) => {
        unsafe {
            let rc = crate::api::get_api()
                .$ff
                .expect(&format!("no {}", stringify!($ff)))($a1, $a2, $a3, $a4);
            // tracing::trace!(?rc, stringify!($ff));
            rc
        }
    };

    ($ff: ident, $a1: expr, $a2: expr, $a3: expr, $a4: expr, $a5: expr) => {
        unsafe {
            let rc =
                crate::api::get_api()
                    .$ff
                    .expect(&format!("no {}", stringify!($ff)))($a1, $a2, $a3, $a4, $a5);
            // tracing::trace!(?rc, stringify!($ff));
            rc
        }
    };

    ($ff: ident, $a1: expr, $a2: expr, $a3: expr, $a4: expr, $a5: expr, $a6: expr) => {
        unsafe {
            let rc = crate::api::get_api()
                .$ff
                .expect(&format!("no {}", stringify!($ff)))(
                $a1, $a2, $a3, $a4, $a5, $a6
            );
            // tracing::trace!(?rc, stringify!($ff));
            rc
        }
    };

    ($ff: ident, $a1: expr, $a2: expr, $a3: expr, $a4: expr, $a5: expr, $a6: expr, $a7: expr) => {
        unsafe {
            let rc = crate::api::get_api()
                .$ff
                .expect(&format!("no {}", stringify!($ff)))(
                $a1, $a2, $a3, $a4, $a5, $a6, $a7
            );
            // tracing::trace!(?rc, stringify!($ff));
            rc
        }
    };

    ($ff: ident, $a1: expr, $a2: expr, $a3: expr, $a4: expr, $a5: expr, $a6: expr, $a7: expr, $a8: expr) => {
        unsafe {
            let rc = crate::api::get_api()
                .$ff
                .expect(&format!("no {}", stringify!($ff)))(
                $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8
            );
            // tracing::trace!(?rc, stringify!($ff));
            rc
        }
    };
}

macro_rules! ok {
    ($ff: ident $(, $more:expr)*) => {
        {

            let rc = crate::api::api!($ff $(, $more)*);
            crate::error::get_error(rc)
        }
    };
}

pub(crate) use api;
pub(crate) use ok;

#[cfg(test)]
#[test]
fn test_get_api_version() {
    use tracing::*;
    std::env::set_var("RUST_LOG", "trace");
    let _ = tracing_subscriber::fmt::try_init();
    let ver = get_api_version();
    info!(ver, "api version=");
}