rssn 0.2.9

A comprehensive scientific computing library for Rust, aiming for feature parity with NumPy and SymPy.
Documentation
use std::ffi::c_char;

use crate::ffi_apis::common::from_json_string;
use crate::ffi_apis::common::to_json_string;
use crate::symbolic::core::Expr;
use crate::symbolic::multi_valued::abs;
use crate::symbolic::multi_valued::arg;
use crate::symbolic::multi_valued::general_arccos;
use crate::symbolic::multi_valued::general_arcsin;
use crate::symbolic::multi_valued::general_arctan;
use crate::symbolic::multi_valued::general_log;
use crate::symbolic::multi_valued::general_nth_root;
use crate::symbolic::multi_valued::general_power;
use crate::symbolic::multi_valued::general_sqrt;

/// Computes general multi-valued logarithm (JSON)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_json_general_log(
    z_json: *const c_char,
    k_json: *const c_char,
) -> *mut c_char {
    let z: Option<Expr> = from_json_string(z_json);

    let k: Option<Expr> = from_json_string(k_json);

    match (z, k) {
        | (Some(z_expr), Some(k_expr)) => {
            let result = general_log(&z_expr, &k_expr);

            to_json_string(&result)
        },
        | _ => std::ptr::null_mut(),
    }
}

/// Computes general multi-valued square root (JSON)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_json_general_sqrt(
    z_json: *const c_char,
    k_json: *const c_char,
) -> *mut c_char {
    let z: Option<Expr> = from_json_string(z_json);

    let k: Option<Expr> = from_json_string(k_json);

    match (z, k) {
        | (Some(z_expr), Some(k_expr)) => {
            let result = general_sqrt(&z_expr, &k_expr);

            to_json_string(&result)
        },
        | _ => std::ptr::null_mut(),
    }
}

/// Computes general multi-valued power (JSON)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_json_general_power(
    z_json: *const c_char,
    w_json: *const c_char,
    k_json: *const c_char,
) -> *mut c_char {
    let z: Option<Expr> = from_json_string(z_json);

    let w: Option<Expr> = from_json_string(w_json);

    let k: Option<Expr> = from_json_string(k_json);

    match (z, w, k) {
        | (Some(z_expr), Some(w_expr), Some(k_expr)) => {
            let result = general_power(&z_expr, &w_expr, &k_expr);

            to_json_string(&result)
        },
        | _ => std::ptr::null_mut(),
    }
}

/// Computes general multi-valued n-th root (JSON)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_json_general_nth_root(
    z_json: *const c_char,
    n_json: *const c_char,
    k_json: *const c_char,
) -> *mut c_char {
    let z: Option<Expr> = from_json_string(z_json);

    let n: Option<Expr> = from_json_string(n_json);

    let k: Option<Expr> = from_json_string(k_json);

    match (z, n, k) {
        | (Some(z_expr), Some(n_expr), Some(k_expr)) => {
            let result = general_nth_root(&z_expr, &n_expr, &k_expr);

            to_json_string(&result)
        },
        | _ => std::ptr::null_mut(),
    }
}

/// Computes general multi-valued arcsin (JSON)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_json_general_arcsin(
    z_json: *const c_char,
    k_json: *const c_char,
) -> *mut c_char {
    let z: Option<Expr> = from_json_string(z_json);

    let k: Option<Expr> = from_json_string(k_json);

    match (z, k) {
        | (Some(z_expr), Some(k_expr)) => {
            let result = general_arcsin(&z_expr, &k_expr);

            to_json_string(&result)
        },
        | _ => std::ptr::null_mut(),
    }
}

/// Computes general multi-valued arccos (JSON)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_json_general_arccos(
    z_json: *const c_char,
    k_json: *const c_char,
    s_json: *const c_char,
) -> *mut c_char {
    let z: Option<Expr> = from_json_string(z_json);

    let k: Option<Expr> = from_json_string(k_json);

    let s: Option<Expr> = from_json_string(s_json);

    match (z, k, s) {
        | (Some(z_expr), Some(k_expr), Some(s_expr)) => {
            let result = general_arccos(&z_expr, &k_expr, &s_expr);

            to_json_string(&result)
        },
        | _ => std::ptr::null_mut(),
    }
}

/// Computes general multi-valued arctan (JSON)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_json_general_arctan(
    z_json: *const c_char,
    k_json: *const c_char,
) -> *mut c_char {
    let z: Option<Expr> = from_json_string(z_json);

    let k: Option<Expr> = from_json_string(k_json);

    match (z, k) {
        | (Some(z_expr), Some(k_expr)) => {
            let result = general_arctan(&z_expr, &k_expr);

            to_json_string(&result)
        },
        | _ => std::ptr::null_mut(),
    }
}

/// Computes argument (angle) of complex number (JSON)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_json_arg(z_json: *const c_char) -> *mut c_char {
    let z: Option<Expr> = from_json_string(z_json);

    if let Some(z_expr) = z {
        let result = arg(&z_expr);

        to_json_string(&result)
    } else {
        std::ptr::null_mut()
    }
}

/// Computes absolute value (magnitude) of complex number (JSON)
#[unsafe(no_mangle)]
pub extern "C" fn rssn_json_abs(z_json: *const c_char) -> *mut c_char {
    let z: Option<Expr> = from_json_string(z_json);

    if let Some(z_expr) = z {
        let result = abs(&z_expr);

        to_json_string(&result)
    } else {
        std::ptr::null_mut()
    }
}