mmex_lib 0.1.1-beta.1

Library for interacting with Money Manager EX data and logic
Documentation
use crate::ffi::engine::MmexEngine;
use std::ffi::{CStr, CString};
use std::os::raw::c_char;
use std::sync::Arc;

#[no_mangle]
pub extern "C" fn mmex_engine_new(path: *const c_char, key: *const c_char) -> *mut Arc<MmexEngine> {
    if path.is_null() {
        return std::ptr::null_mut();
    }
    let c_path = unsafe { CStr::from_ptr(path) }
        .to_string_lossy()
        .into_owned();
    let c_key = if key.is_null() {
        None
    } else {
        Some(
            unsafe { CStr::from_ptr(key) }
                .to_string_lossy()
                .into_owned(),
        )
    };

    match MmexEngine::new(c_path, c_key) {
        Ok(engine) => Box::into_raw(Box::new(engine)),
        Err(_) => std::ptr::null_mut(),
    }
}

#[no_mangle]
pub extern "C" fn mmex_engine_free(engine: *mut Arc<MmexEngine>) {
    if !engine.is_null() {
        unsafe {
            let _ = Box::from_raw(engine);
        }
    }
}

#[no_mangle]
pub extern "C" fn mmex_free_string(s: *mut c_char) {
    if !s.is_null() {
        unsafe {
            let _ = CString::from_raw(s);
        }
    }
}

#[no_mangle]
pub extern "C" fn mmex_get_accounts_json(engine: *mut Arc<MmexEngine>) -> *mut c_char {
    let engine = unsafe { &*(engine) };
    match engine.accounts().get_all_json() {
        Ok(json) => CString::new(json).unwrap().into_raw(),
        Err(e) => CString::new(format!(r#"{{"error": "{}"}}"#, e))
            .unwrap()
            .into_raw(),
    }
}

#[no_mangle]
pub extern "C" fn mmex_get_tags_json(engine: *mut Arc<MmexEngine>) -> *mut c_char {
    let engine = unsafe { &*(engine) };
    match engine.tags().get_all_json() {
        Ok(json) => CString::new(json).unwrap().into_raw(),
        Err(e) => CString::new(format!(r#"{{"error": "{}"}}"#, e))
            .unwrap()
            .into_raw(),
    }
}